2016-01-11 2 views
0

Для проекта, над которым я работаю, я пытаюсь разрешить пользователю вращать куб в зависимости от направления, которое они прокручивают на экране. У меня есть эта работа, кроме направления вращения куба.Найти вектор вперед на основе местоположения камеры

Например, мой вектор вперед начинается с (0, 0, -1). Однако, как только я поворачиваю куб на 90 градусов в направлении, передний вектор меняется. Это то, что я ожидаю, но создает проблему для того, что я делаю.

У меня есть код набора, чтобы определить, каким образом направление камеры, проверяя проверки камеры вперед, как так ...

GLKVector3 forward = [ m_camera getForwardVector ]; 
if (fabsf(forward.x) > fabsf(forward.z)) { 
    // Need forward vector to be in x-direction 
    // Rotate cube around axis (0.0f, 0.0f, 1.0f); 
} else { 
    // Need forward vector to be in z-direction 
    // Rotate cube around axis (1.0f, 0.0f, 0.0f); 
} 

То, что я хочу сделать, это повернуть куб вокруг указанной оси , Однако после того, как куб вращается несколько раз, позиции векторов не совпадают с мировыми позициями, поэтому он не вращается правильно из-за измененных позиций вектора.

Вращение кубов хранится в кватернионе. Итак, есть ли способ определить, какой вектор представляет собой «прямой» вектор, основанный на том, где находится камера?

Вот мой код поворота, если это вообще помогает. Благодаря!

- (void) rotate: (GLKVector3) axis withAngle: (GLfloat) angle { 
    [ self rotate: GLKQuaternionMakeWithAngleAndVector3Axis(GLKMathDegreesToRadians(angle), axis) ]; 
} 

- (void) rotate: (GLKQuaternion) quat { 
    m_rotation = GLKQuaternionNormalize(GLKQuaternionMultiply(m_rotation, quat)); 
} 

ответ

0

Хорошо, так после прочтения много вещей вокруг StackOverflow, я придумал решение для моей проблемы, и я хочу поделиться им в случае, если кто-то борется.

Я был на правильном пути, но должен был внести незначительные изменения. Сначала был метод rotate. В шахте я вращался вокруг своей локальной оси объектов. Я изменил его так, чтобы вращать вокруг мировой оси.

- (void) rotate: (GLKVector3) axis withAngle: (GLfloat) angle { 
    // THIS WILL ROTATE AROUND THE WORLD AXIS 
    m_rotation = GLKQuaternionMultiply(GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(angle), axis.x, axis.y, axis.z), m_rotation); 


    // THIS WILL ROTATE AROUD THE LOCAL AXIS 
    // m_rotation = GLKQuaternionMultiply(m_rotation, GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(angle), axis.x, axis.y, axis.z)); 
} 

Теперь я мог бы вращаться вокруг оси мира. Затем, когда я вращался, я мог использовать передний вектор так.

GLKVector3 forward = [ m_camera getCurrentViewPosition ]; 
if (fabsf(forward.x) > fabs(forward.z)) { 
    m_rotateZ = (forward.x < 0) ? -ROTATION_AMOUNT : ROTATION_AMOUNT; 
    m_shouldRotateZ = true; 
} else { 
    m_rotateX = (forward.z < 0) ? ROTATION_AMOUNT : -ROTATION_AMOUNT; 
    m_shouldRotateX = true; 
} 
m_totalRotation = 0; 

Я проверил длину компонентов вектора. Где x было длиннее, передний вектор находился в направлении x, поэтому я мог вращаться вокруг оси z.

Я надеюсь, что это очистит некоторые вещи и, возможно, поможет кому-то в будущем. Если у вас есть какие-либо вопросы, не стесняйтесь оставлять комментарии, и я помогу очистить еще кое-что.