2013-08-10 5 views
1

Мне нужен способ (в java), чтобы рассчитать, в каком направлении моя камера будет двигаться вперед по осям x и z в зависимости от направления, с которым обращена камера (рыскания), и для y (вертикальная ось). Я делаю свой собственный игровой движок и свою собственную камеру.Как сделать камеру движением в направлении, в котором она находится в java?

При всех значениях по умолчанию, равных нулю, перемещение камеры правильно направляет все движения вдоль положительной оси z. Однако, когда я панорамирую камеру влево или вправо (тем самым изменяя рыскание), камера все еще движется только вдоль оси z ... Итак, как мне рассчитать изменение направления к осям x, y и z?

Диапазон цен на рыскание составляет 0 (юг), 45 (юго-запад), 90 (запад), 135 (северо-запад), 180 (север), 225 (северо-восток), 270 (восток), 315 (юго-восток) , и обратно до 360 (юг, то же, что и 0).

Что я ищу с направлениями компаса (где «+» или «-» указывает на изменение значения вдоль этой оси):

South = x, y, z+ 
SouthWest = x+, y, z+ 
West = x+, y, z 
NorthWest = x+, y, z- 
North = x, y, z- 
NorthEast = x-, y, z- 
East = x-, y, z 
SouthEast = x-, y, z+ 

Диапазон значений на поле 0.0 (средний), 100.0 (вверх по всему пути) и -100.0 (до упора).

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

ответ

1

Предположим, вы хотите переместить камеру в направлении и с дистанцией k. Для простоты я преобразую ваши направления в углы, где 0.0 изображает справа, Pi/2 представляет вверх, Pi представляет левый, 3 * Pi/2 представляет вниз и так далее.

EDIT: Как вы говорите, на камеру будет влиять только поле. X и z вместо этого будут влиять как на рыскание, так и на высоту.

Вы можете рассчитать новые х, у и г следующим:

float y = // Yaw angle 
float p = // Pitch angle 
float k = // Move distance 

float xzLength = cos(p) * k; 
float dx = xzLength * cos(y); 
float dz = xzLength * sin(y); 
float dy = k * sin(p); 

// Update your camera: 
camera.x += dx; 
camera.y += dy; 
camera.z += dz; 

Очевидно, рыскания и тангажа не меняются, так что вам не нужно обновлять их.

+0

Отлично, я изучу это, как только смогу! Только один быстрый вопрос, если бы я действительно хотел, чтобы шаг (движение вверх и вниз) учитывался в значениях x и z для «летающей» камеры, как бы я это сделал? –

+0

Я думаю, что шаг фактически учтен в x и z в моем решении, так как вы можете видеть, что xzLength зависит от p и dz, dx зависит от него, неужели я не понимаю ваш вопрос? – Lake

+0

Наоборот, если вы хотите * не * учитывать шаг в x и z, вы должны позволить просто xzLength = k вместо этого – Lake

 Смежные вопросы

  • Нет связанных вопросов^_^