2015-04-27 5 views
1

Я делаю 3D-игру с использованием C++ и Irrlicht. Это игра в стиле FPS, поэтому игрок должен иметь возможность носить оружие. Но я боролся с вычислением положения относительно камеры. Если камера не будет вращаться, расчет будет легко:Расчет положения элемента относительно камеры

// node is camera's child 
vector3df modifier = vector3df(2, 0, 2); 
node->setPosition(node->getPosition() + modifier); 

Но тем не менее, камера не является статичным, а вращающийся объект, поэтому все немного сложнее. Вот изображение, которое мы надеемся crearifies то, что я пытаюсь сказать:

A picture tells more than a thousand words

Это должно работать во всех измерениях, X, Y и Z. Я думаю, что есть только две тригонометрические функции для такого рода целей, синус и косинус, которые предназначены для вычисления координат X и Y. Неужели я ошибаюсь, или они могут быть применены к этому? Или есть решение в Иррихте? Там это код, который я пытался использовать (нашел его от SO):

vector3df obj = vector3df(2, 0, 2); 
vector3df n = vector3df(0, 0, 0); 
n.X = obj.X * cos(60 * DEGTORAD) - obj.Z * sin(60 * DEGTORAD); 
n.Z = obj.Z * cos(60 * DEGTORAD) + obj.X * sin(60 * DEGTORAD); 
node->setPosition(node->getPosition() + n); 

Но оружие просто летит вперед.

Я был бы рад за любую помощь или руководство.

P.S. Надеюсь, этот вопрос ясен, чем предыдущий.

+0

Это не вопрос программирования (как таковой), это скорее вопрос математики. – CoryKramer

+0

Да, это правда. Разве я спросил об этом еще раз? –

+0

Я бы так предложил. У вас будут пользователи более знакомы с этим типом геометрии (не то, чтобы вам не повезло и найти здесь тоже). Как только вы сможете записать уравнения на бумаге, вы можете задать здесь, если вы застрянете в реализации кода. – CoryKramer

ответ

1

Проблема с вашим кодом заключается в том, что вращение выполняется вокруг начала координат, а не вокруг камеры.

То, что вы хотите сделать, это повернуть объект (оружие) вокруг центра камеры на угол, что камера вращается:

Для этого необходимо выполнить следующие действия:

1 - Перевести все точки так, чтобы центр камеры находится в начале координат,

2 - Применить матрицу поворота (угол альфа):

[cos (alpha) -sin (alpha)] 
[sin (alpha) cos (alpha)] 

3 - Отмените шаг 1 на повернутой точке.

Пример алгоритма:

Position of the weapon: (xObject, yObject) 
Position of the camera: (xCamera, yCamera) 
Turning angle: alpha  

    //step 1: 
    xObject -= xCamera; 
    yObject -= yCamera; 

    // step 2 
    xRot = xObject * cos(alpha) - yObject * sin(alpha); 
    yRot = xObject * sin(alpha) + yObject * cos(alpha); 

    // step 3: 
    xObject = xRot + xCamera; 
    yObject = yRot + yCamera; 

Этот алгоритм на плоскости XY, но может быть изменен на плоскости XZ. Предположим, что в вашем коде obj обозначают положение оружия. Ваш код может быть примерно таким:

... 
// Step 1 
obj.X-=cam.X; 
obj.Z-=cam.Z; 

//Step 2 
n.X = obj.X * cos(60 * DEGTORAD) - obj.Z * sin(60 * DEGTORAD); 
n.Z = obj.Z * cos(60 * DEGTORAD) + obj.X * sin(60 * DEGTORAD); 

// Step 3 
obj.X = n.X + cam.X; 
obj.Z = n.Z + cam.Z; 
... 

Надеюсь, что это поможет!