2014-12-15 3 views
-1

Предположим, у меня есть эта модель курицы, которую я хочу постоянно смотреть на зрителя (положение камеры) или, что проще, на начало координат (0,0,0). Как рассчитать углы для каждой оси, чтобы я мог повернуть объект вместе с ними?Направление вращения углов в 3D?

Edit:

Извините, если мой вопрос был слишком общий характер. Я все еще борюсь с этим. Предположим, что положение трехмерной модели (x, y, z) в пространстве модели, и я хочу, чтобы модель «смотрела» на начало координат. Мои первые мысли заключались в том, чтобы начать вращаться вокруг оси x (повернуть вертикально): Рассмотрим желтый круг как плоскость y.

image

Так что я попытался следующий код, который не вращает модель на всех.

glm::vec3 camPos = camera.GetPosition(); 
float value = camPos.y/glm::sqrt(glm::pow(camPos.x,2.0f) + glm::pow(camPos.y, 2.0f) + glm::pow(camPos.z, 2.0f)); 
float angle = glm::asin(value); 
cow.SetModelMatrix(glm::translate(camPos - glm::vec3(0,0,1.5)) * //then translate so the cow will appear a little bit infront of the camera 
        glm::rotate(glm::radians(angle), glm::vec3(-1,0,0)) *//then rotate vertically by the angle 
        glm::scale(glm::vec3(0.1, 0.1, 0.1)) //first scale, cause the cow (i mean chicken) is too big 
        ); 

Камера запускается в позиции (0, 0, 5), глядя в сторону отрицательной оси z. Что я делаю неправильно?

+1

Вы не предоставили достаточно информации для получения хорошего ответа. Приведите пример значений, а также последовательность поворотов, которые вы используете для ориентации. – ja72

+0

Я не уверен, что вы описываете, но у меня такое чувство, что оно называется [«billboarding»] (http://nehe.gamedev.net/article/billboarding_how_to/18011/). –

+0

Это потому, что вы вращаете корову, а не курица. –

ответ

0

Если цыпленок находится в начале координат c=(0,0,0), а камера находится в положении r=(x,y,z) и земля находится в y=0. Тогда вам нужна последовательность поворотов, чтобы получить локальную ось цыпленка, направленную к камере.

первых сориентировать вашу x ось на плоскости с поворотом вокруг вертикальной y оси с углом φ=-ATAN(z/x), а затем вращение вокруг z оси с углом ψ=ATAN(y/√(x^2+z^2))

Это создает матрицу вращения 3 × 3 E = ROT_Y(φ)*ROT_Z(ψ)

| x/d -x*y/(d*√(x^2+z^2)) -z/√(x^2+z^2) | 
E = | y/d √(x^2+z^2)/d   0  | 
    | z/d -y*z/(d*√(x^2+z^2)) x/√(x^2+z^2) | 

, где d=√(x^2+y^2+z^2). Вы видите локальную ось x (первый столбец E), указывающий на (x,y,z). Также локальная ось z не имеет компонента по вертикали, поэтому она всегда лежит на плоскости земли.

Но это зависит от реализации, например, если вам нужно держать курицу y вертикальной (в отличие от сохранения z в плоскости заземления) вам понадобится другой набор поворотов и углов. Поэтому для полного ответа вам необходимо предоставить дополнительную информацию.

+0

Я действительно редактировал свой вопрос, вы можете ответить? Ваше дело не то, что я ищу – Pilpel