|
Математика Методы математического моделлирования, программирование математических концепций, роль математики в создании игр |
19.11.2012, 05:45
|
#1
|
ПроЭктировщик
Регистрация: 20.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, 21:35
|
#2
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Достать угол с mat4.
Дак... Раз поврот - есть смена координат. Инфа о повороте нигде не хранится. Могу только рикаминдовать хранить её самому (хоть в том же объекте).
|
(Offline)
|
|
20.11.2012, 01:13
|
#3
|
ПроЭктировщик
Регистрация: 20.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)
|
|
20.11.2012, 02:05
|
#4
|
|
Ответ: Достать угол с mat4.
предположим если нет никаких матриц то твоя камера стоит в (0, 0, 0) и смотрит в (0, 0, -1), а вверх у неё в (0, 1, 0)
берёшь вектора (0, 0, -1) и (0, 1, 0), превращаешь в кватернион, умножаешь на матрицу, переводишь в углы Эйлера, всё
|
|
|
Сообщение было полезно следующим пользователям:
|
|
20.11.2012, 15:00
|
#5
|
ПроЭктировщик
Регистрация: 20.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)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:57.
|