Вращение XNA над данным вектором - PullRequest
0 голосов
/ 05 января 2012

Я новичок в XNA, извините за простой вопрос, но я не могу найти никакого решения.

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

Я бы хотел повернуть свой объект над данной «линией».Я нашел Matrix.CreateLookAt(currentPosition, dstPosition, Vector.Up); метод, но все еще не знаю, как объединить вращение с такой матрицей.

1 Ответ

3 голосов
/ 06 января 2012

Matrix.CreateLookAt предназначен для использования в камере, а не для манипулирования моделями (хотя я уверен, что некоторые умные люди, которые понимают, какую матрицу он создает, сделали это).

То, что вы хотите сделать, это вращать вашу модель вокруг произвольной оси в пространстве. Это не анимация (они создаются в программном обеспечении для 3D-моделирования, а не игра), это трансформация. Преобразования - это методы, с помощью которых вы можете перемещать, вращать и масштабировать модель, и, очевидно, суть трехмерная игровая графика.

Для вашей проблемы, вы хотите повернуть этот плоский кусок вокруг его края, да? Для этого вы совместите перемещение и вращение оси.

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

Matrix originTranslation = Matrix.CreateTranslation(new Vector3(-modelWidth / 2f, 0, 0))

(Предполагается квадратная модель. Манипулируйте вектором 3 до тех пор, пока требуемый край не пересекает начало координат)

Теперь мы хотим сделать вращение. Это зависит от угла вашего края. Если ваша модель представляет собой квадрат и, таким образом, край является прямым вперед в направлении Z, мы можем просто вращаться вокруг Vector3.Forward. Однако, если ваш край наклонен (как я представляю, как на обложке для фортепиано), вам придется самостоятельно определить угол и создать Вектор объектов с тем же углом. Теперь вы создадите еще одну матрицу:

Matrix axisRotation = Matrix.CreateFromAxisAngle(myAxis, rotation)

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

Этот последний бит является ключом к вашей «анимации». То, что вы захотите сделать, это изменить количество плавающих элементов в зависимости от того, сколько времени прошло, чтобы создать «анимацию» открытия фортепьяно со временем. Конечно, вы захотите зафиксировать его на более высоком уровне, иначе ваша крышка просто будет вращаться.

Теперь, чтобы реально преобразовать вашу модель покрытия, вы должны умножить ее матрицу мира на две вышеупомянутые матрицы по порядку.

pianoCover.World *= originTranslation * axisRotation;

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

Итак, обратите внимание, как матрицы используются в 3D играх. Матрица создается с использованием соответствующего метода Matrix для создания желаемых качеств (перемещение, вращение вокруг оси, масштаб и т. Д.). Вы делаете матрицу для каждого из этих свойств. Затем вы умножаете их в определенном порядке ( порядок имеет значение при умножении матрицы ), чтобы преобразовать вашу модель по вашему желанию. Часто, как видно здесь, эти преобразования являются промежуточными, чтобы получить желаемый эффект (мы не могли просто переместить обложку туда, куда мы хотели, а затем повернуть ее вокруг своей кромки; нам пришлось переместить край в начало координат, повернуть, переместить обратно и т. д.).

Работать с матрицами в 3D довольно сложно. На самом деле, возможно, я не все понял правильно (надеюсь, к настоящему времени я знаю это достаточно хорошо, но ...). Чем больше вы практикуетесь, тем лучше вы можете судить, как выполнять такие задачи. Я бы порекомендовал прочитать учебники по этому вопросу. Любой учебник, посвященный 3D в XNA, будет иметь эту тему.

В заключение, хотя, если вы достаточно хорошо знаете программное обеспечение для 3D-моделирования, я бы, вероятно, предложил вам просто сделать реальную анимацию пианино, открывать и закрывать обложки и использовать эту анимированную модель в вашей игре вместо использования моделей для обоих пианино и обложку и пытаемся держать их вместе.

...