Отслеживание локального координатного пространства объектов - PullRequest
1 голос
/ 01 февраля 2009

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

Локальное координатное пространство объектов, как мне его "взять"? Скажите, что я загружаю Орка в свою игру, как мне программно узнать, где находится его голова, левая рука, правая рука и происхождение (пупок?)? И когда я знаю, где это, мне нужно сохранить его вручную или это что-то волшебное существует в DirectX API? В моем другом вопросе один человек сказал что-то о сохранении вершины для направлений X, Y, Z и и происхождения? Как мне найти эти вершины? Я выбираю их произвольно, назначаю их в модель перед загрузкой в ​​мою игру? и т.д.

Речь не идет о преобразовании координатных пространств

1 Ответ

4 голосов
/ 01 февраля 2009

На самом деле речь идет о преобразовании между координатными пространствами .

Хорошо, вы понимаете, что у вас может быть Матрица, которая выполняет Перевод или Вращение. (Или масштабирование. Или перекос. И т.д.). Вы можете умножить такую ​​Матрицу на точку (V), чтобы получить новую (переведенную / повернутую / и т. Д.) Точку. E.g.:

Mtranlate = [ 1 0 0 Tx ]   *  V = [ Vx ]   =   [ Vx + Tx ]
            [ 0 1 0 Ty ]          [ Vy ]       [ Vy + Ty ]
            [ 0 0 1 Tz ]          [ Vz ]       [ Vz + Tz ]
            [ 0 0 0 1  ]          [  1 ]       [  1      ]

Или вращение вокруг оси X / Y / Z:

Mrotate_x = [ 1  0     0    0 ]  * V =  [ Vx ]   =   [ Vx              ]
            [ 0 cos  -sin   0 ]         [ Vy ]       [ Vy*cos - Vz*sin ]
            [ 0 sin   cos   0 ]         [ Vz ]       [ Vy*sin + Vz*cos ]
            [ 0  0     0    1 ]         [  1 ]       [  1              ]

что вы можете объединить несколько операций, умножив матрицы вместе.
Например: Mnew = Mtranslate * Mrotate_x.
(И да, порядок имеет значение!)

Таким образом, учитывая базовое происхождение реального мира, вы можете перевести его в (xy) (известное / предоставленное) положение орка xy, вывести из ландшафта в этой точке, каково местоположение z ног вашего орка, и перевести на него. Теперь у вас есть ноги орка в глобальных координатах. Оттуда вы можете повернуть своего орка, чтобы он повернулся в определенном направлении.

Затем переведите вверх (в зависимости от модели вашего орка), чтобы найти его шею. От шеи мы можем переместиться вверх (и, возможно, повернуть), чтобы найти его голову или над ней, чтобы найти ее плечо. С плеча мы можем вращаться и переводить, чтобы найти локоть. От локтя мы можем вращаться и переводить, чтобы найти руку.

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

(Имейте в виду, я бы оживил орка и просто использовал бы его расположение ног x, y, z. В противном случае это слишком много работы.)

Вы видите много такого рода вещей в робототехнике, которые могут обеспечить хорошее элементарное введение в прямую кинематику. В робототехнике, по крайней мере, с более простыми роботами, у вас есть двигатель, который вращается, и длина конечности, на которую нужно перевести. А потом еще один мотор. (Напротив, плечевой сустав человека может вращаться вокруг всех трех осей одновременно.)

Вы можете просмотреть курс РУКОВОДСТВА для класса роботизированной манипуляции CMU (15-384).

Возможно, что-то вроде их Forward Kinematics Intro .

...