Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование в широком смысле слова > Математика

Математика Методы математического моделлирования, программирование математических концепций, роль математики в создании игр

Ответ
 
Опции темы
Старый 19.11.2012, 01:45   #1
ІГРОГРАЙКО
ПроЭктировщик
 
Аватар для ІГРОГРАЙКО
 
Регистрация: 19.06.2009
Адрес: Україна
Сообщений: 152
Написано 10 полезных сообщений
(для 24 пользователей)
Достать угол с mat4.

Для WebGL есть файл с функциями операций с матрицами glMatrix.js. Там есть функция:
    mat4.rotate = function (mat, angle, axis, dest) {
        var x = axis[0], y = axis[1], z = axis[2],
            len = Math.sqrt(x * x + y * y + z * z),
            s, c, t,
            a00, a01, a02, a03,
            a10, a11, a12, a13,
            a20, a21, a22, a23,
            b00, b01, b02,
            b10, b11, b12,
            b20, b21, b22;

        if (!len) { return null; }
        if (len !== 1) {
            len = 1 / len;
            x *= len;
            y *= len;
            z *= len;
        }

        s = Math.sin(angle);
        c = Math.cos(angle);
        t = 1 - c;

        a00 = mat[0]; a01 = mat[1]; a02 = mat[2]; a03 = mat[3];
        a10 = mat[4]; a11 = mat[5]; a12 = mat[6]; a13 = mat[7];
        a20 = mat[8]; a21 = mat[9]; a22 = mat[10]; a23 = mat[11];

        // Construct the elements of the rotation matrix
        b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s;
        b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s;
        b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c;

        if (!dest) {
            dest = mat;
        } else if (mat !== dest) { // If the source and destination differ, copy the unchanged last row
            dest[12] = mat[12];
            dest[13] = mat[13];
            dest[14] = mat[14];
            dest[15] = mat[15];
        }

        // Perform rotation-specific matrix multiplication
        dest[0] = a00 * b00 + a10 * b01 + a20 * b02;
        dest[1] = a01 * b00 + a11 * b01 + a21 * b02;
        dest[2] = a02 * b00 + a12 * b01 + a22 * b02;
        dest[3] = a03 * b00 + a13 * b01 + a23 * b02;

        dest[4] = a00 * b10 + a10 * b11 + a20 * b12;
        dest[5] = a01 * b10 + a11 * b11 + a21 * b12;
        dest[6] = a02 * b10 + a12 * b11 + a22 * b12;
        dest[7] = a03 * b10 + a13 * b11 + a23 * b12;

        dest[8] = a00 * b20 + a10 * b21 + a20 * b22;
        dest[9] = a01 * b20 + a11 * b21 + a21 * b22;
        dest[10] = a02 * b20 + a12 * b21 + a22 * b22;
        dest[11] = a03 * b20 + a13 * b21 + a23 * b22;
        return dest;
    };
Поворот матрицы на указанный угол (в радианах) по указанным осям. Но нету функции которая бы возвращала угол поворота указанной оси соответствующей матрицы.
Типа:
mat4.getPitch = function (mat) {
...
}

mat4.getYaw = function (mat) {
...
}

mat4.getRoll = function (mat) {
...
}
Я спрашиваю может есть у кого то готовое решение. Заранее спасибо!
__________________
Blitz3D, XNA, WebGL, OpenGL, Unity3D
PC: ASUS A55VM Core i3 (2.4Ghz), 6 Gb RAM, Nvidia GF 630M GT 2Gb
(Offline)
 
Ответить с цитированием
Старый 19.11.2012, 17:35   #2
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 25.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,452
Написано 5,277 полезных сообщений
(для 15,249 пользователей)
Ответ: Достать угол с mat4.

Дак... Раз поврот - есть смена координат. Инфа о повороте нигде не хранится. Могу только рикаминдовать хранить её самому (хоть в том же объекте).
(Offline)
 
Ответить с цитированием
Старый 19.11.2012, 21:13   #3
ІГРОГРАЙКО
ПроЭктировщик
 
Аватар для ІГРОГРАЙКО
 
Регистрация: 19.06.2009
Адрес: Україна
Сообщений: 152
Написано 10 полезных сообщений
(для 24 пользователей)
Ответ: Достать угол с mat4.

Сообщение от ABTOMAT Посмотреть сообщение
Дак... Раз поврот - есть смена координат. Инфа о повороте нигде не хранится. Могу только рикаминдовать хранить её самому (хоть в том же объекте).
суть в том, что после выполнения поворота, выполняется еще 2 функции mat4.multiply() с другими матрицами (орбитальная камера см. пример WebGL Lesson 11 – spheres, rotation matrices, and mouse events)... И после этого углы на которые я повернул первую матрицу уже изменены, а мне нужно знать их...
__________________
Blitz3D, XNA, WebGL, OpenGL, Unity3D
PC: ASUS A55VM Core i3 (2.4Ghz), 6 Gb RAM, Nvidia GF 630M GT 2Gb
(Offline)
 
Ответить с цитированием
Старый 19.11.2012, 22:05   #4
jimon
 
Сообщений: n/a
Ответ: Достать угол с mat4.

предположим если нет никаких матриц то твоя камера стоит в (0, 0, 0) и смотрит в (0, 0, -1), а вверх у неё в (0, 1, 0)

берёшь вектора (0, 0, -1) и (0, 1, 0), превращаешь в кватернион, умножаешь на матрицу, переводишь в углы Эйлера, всё
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ІГРОГРАЙКО (20.11.2012)
Старый 20.11.2012, 11:00   #5
ІГРОГРАЙКО
ПроЭктировщик
 
Аватар для ІГРОГРАЙКО
 
Регистрация: 19.06.2009
Адрес: Україна
Сообщений: 152
Написано 10 полезных сообщений
(для 24 пользователей)
Ответ: Достать угол с mat4.

Есть! нашел в том же файле (glMatrix.js)...
/**
* Stores the angle and axis in a vec4, where the XYZ components represent
* the axis and the W (4th) component is the angle in radians.
*
* If dest is not given, src will be modified in place and returned, after
* which it should not be considered not a quaternion (just an axis and angle).
*
* @param {quat4} quat the quaternion whose angle and axis to store
* @param {vec4} [dest] the optional vec4 to receive the data
*
* @returns {vec4} dest
*/
    quat4.toAngleAxis = function(src, dest) {
        if (!dest) dest = src;
        // The quaternion representing the rotation is
        // q = cos(A/2)+sin(A/2)*(x*i+y*j+z*k)

        var sqrlen = src[0]*src[0]+src[1]*src[1]+src[2]*src[2];
        if (sqrlen > 0)
        {
            dest[3] = 2 * Math.acos(src[3]);
            var invlen = glMath.invsqrt(sqrlen);
            dest[0] = src[0]*invlen;
            dest[1] = src[1]*invlen;
            dest[2] = src[2]*invlen;
        } else {
            // angle is 0 (mod 2*pi), so any axis will do
            dest[3] = 0;
            dest[0] = 1;
            dest[1] = 0;
            dest[2] = 0;
        }
        
        return dest;
    };
Теперь только матрицу в кватернион конвертнуть...
__________________
Blitz3D, XNA, WebGL, OpenGL, Unity3D
PC: ASUS A55VM Core i3 (2.4Ghz), 6 Gb RAM, Nvidia GF 630M GT 2Gb
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 20:00.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com