2012-02-02 5 views
0

Я только что начал создавать физический класс камеры для данных глубины, которые вы получаете от Kinect. У меня есть массив Vector3 из [imageWidth, imageHeight], описывающий ЛОКАЛЬНЫЕ позиции, которые я получаю от kinect (как только я проецирую их обратно на FOV объектива камеры и т. Д.). Затем я переводил, масштабировал и вращал всю виртуальную камеру kinect в пространстве.Как вы извлекаете позиции Vector3 только из мировой матрицы в массиве позиций (от Kinect)

То, что я хочу сделать, это снова вернуть позиции входа камеры kinect, но в пространстве WORLD, а не в ЛОКАЛЬНОЕ пространство (т.е. оно прошло через перевод, масштаб и вращение и дает мне Vector3 для каждого значения из kinect в пространстве WORLD).

Любые идеи?

+0

У меня также есть изображение, но я новичок здесь, так что это не позволит мне разместить его так, дайте мне знать, если вы хотите чтобы увидеть, что я имею в виду, и я отправлю его вам. – stuartwoodrandom

ответ

0
Vector3 pos = Vector3.Transform(Vector3.Zero, worldMatrix); 
+1

Вы уверены, что мировая матрица должна быть перевернута? Если эта формула должна преобразовывать точки из локального пространства в мировое пространство, я думаю, что мировая матрица должна быть оставлена ​​как есть. –

+0

@ Андреа, я думаю, вы правы, инверт будет для чего-то вроде ViewMatrix, теперь исправляющего. –

0

Если я правильно понимаю, у вас есть координаты точки 3D в пространстве камеры, которые вы хотели бы преобразовать в мировое пространство.

Для этого вам необходимо умножить эти координаты на матрицу трансформации камеры. Эта матрица состоит из индивидуального преобразования (трансляции, вращения и масштаба).

Будьте осторожны с порядком, в котором вы применяете преобразования: переведите * масштаб! = Масштаб * перевести.

Возможно, вы можете настроить вашу матрицу следующим образом:


Matrix cameraMatrix = Matrix.CreateScale(cam_sx, cam_sy, cam_sz); 
cameraMatrix *= Matrix.CreateRotationX(MathHelper.ToRadians(cam_rx)); 
cameraMatrix *= Matrix.CreateRotationY(MathHelper.ToRadians(cam_ry)); 
cameraMatrix *= Matrix.CreateRotationZ(MathHelper.ToRadians(cam_rz)); 
cameraMatrix *= Matrix.CreateTranslation(cam_x, cam_y, cam_z); 

// Now we create a point in the camera local space 
Vector3 localPoint = new Vector3(0, 0, 0); 
Vector3 worldPoint = Vector3.Transform(localPoint , cameraMatrix); 

// Now world contains the coordinates in the world space 
// For example, if your camera is located at position (5,5,5) 
// and localPoint=(0,0,0) then worldPoint=(5,5,5) which seems correct.