Войти
ПрограммированиеФорумГрафика

Матрица поворота вокруг произвольной точки Direct3D

#0
21:38, 17 янв. 2012

Здравствуйте.
У меня есть одна задача, которую я не могу решить.
Допустим координаты mesh объекта (meshx, meshy, meshz). Координаты камеры (cx, meshy, cz). Для вращения камеры вокруг mesh я использую матрицу поворота вокруг единичного вектора в декартовой системе координат.
http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D1%80%D0%B8%D1%86… E%D1%82%D0%B0
Камера поворачивается на заданный угол b до тех пор пока meshy = 1.

Вот начальные значения:

// beginning mesh x y z coordinate
float meshx = 0.0f;
float meshy = 1.0f;    // if else - camera rotating doesnt work correct
float meshz = 0.0f;

// angle of camera to rotate every time
float b;

// distance mesh-camera
float d = 8.0f;

// beginning x z camera position
float cx = meshx + d;
float cz = meshz;

//////////////////////////////////////////////////////////////////////////

А вот матрица поворота:

// additional koefficient of rotation speed
float k = 0;

// calculate camera x z position according to mesh x y z position
cx = cx*(cos(b)+(1-cos(b))*meshx*meshx)+meshy*((1-cos(b))*meshx*(meshy+k)+(sin(b))*meshz)+cz*((1-cos(b))*meshz*meshx-(sin(b))*(meshy+k));
cz = cx*((1-cos(b))*meshx*meshz+(sin(b))*(meshy+k))+meshy*((1-cos(b))*(meshy+k)*meshz-(sin(b))*meshx)+cz*(cos(b)+(1-cos(b))*meshz*meshz);

Если поменять meshy на другое число от 1:
1)чем больше число по модулю тем на больший угол поворачивается камера за один раз - тоесть камера вращается вокруг mesh быстрее если mesh поднимается высоко по оси Y.
1)чем меньше число по модулю тем на меньший угол поворачивается камера за один раз - тоесть камера вращается вокруг mesh медленнее если mesh находится близко к нулю по Y.
2)если число = 0 тогда камера вообще не поворачивается.

Не подскажите с чем может быть связана эта проблема? Мне бы хотелось чтобы камера вращалась независимо от meshy. Может я взял не ту матрицу поворота. Помогите пожалуйста.


#1
22:01, 17 янв. 2012

типа того (рабготающий код из моей проги)

                Matrix transl = Matrix.CreateTranslation(rotationPoint);
                Matrix mintransl = Matrix.CreateTranslation(-rotationPoint);

                Quaternion res = Quaternion.CreateFromAxisAngle(axis, angle);
                Matrix roa = Matrix.CreateFromQuaternion(res);
                for (int i = 0; i < operatingObject.Length; i++)
                {
                    Matrix result = startTransforms[i] * mintransl * roa * transl;
                    operatingObject[i].SetGlobalPose(result);
                }

rotationPoint - точка вращения
axis - ось вращения
angle - угол вращения

#2
23:06, 17 янв. 2012

Спасибо.

#3
23:11, 17 янв. 2012

А разве для камеры можно задавать матрицу таким же образом как и для других объектов?
Ведь для камеры есть спец. матрица вида. Я просто совсем новичок, не сильно разбираюсь)

ПрограммированиеФорумГрафика

Тема в архиве.