Three.js: Поверните куб вокруг его края.

Созданный на 5 февр. 2012  ·  5Комментарии  ·  Источник: mrdoob/three.js

Всем привет!

Я уже спрашивал о вращении вокруг произвольной оси и получил четкие ответы в № 1219 и № 1220.

Но до сих пор неясно, как повернуть куб вокруг одного из его ребер (может ли кто-нибудь поделиться таким кодом, если он существует).

В # 1219 разместили две функции:

function rotateAroundObjectAxis( object, axis, radians ) { .. }

и

function rotateAroundWorldAxis( object, axis, radians ) { .. }

Они позволяют мне вращать куб вокруг произвольной оси, проходящей через центр его ограничивающего прямоугольника.

Мне нужно повернуть объект вокруг произвольной оси, которая не обязательно проходит через центр объекта.

Как это сделать правильно?

Извините, если меня это немного раздражает, но я хочу реализовать такую ​​функциональность.

Спасибо.

PS Похоже, мне нужна функция, которая выглядит так:

функция rotateAroundArbitraryAxis (объект, axisDirection, axisBasePoint, радианы) {..}

под axisBasePoint я имею в виду точку, через которую проходит указанная ось.

Я читал в Интернете, что такую ​​ротацию нужно делать в несколько этапов:

  1. переместите пространство так, чтобы ось вращения проходила через начало координат.
  2. повернуть пространство вокруг оси Z так, чтобы ось вращения лежала в плоскости XZ.
  3. повернуть пространство вокруг оси Y так, чтобы ось вращения лежала вдоль оси Z.
  4. выполнить желаемое вращение с помощью Theta вокруг оси z.
  5. применить действие, обратное шагу (3).
  6. применить действие, обратное шагу (2).
  7. применить действие, обратное шагу (1).

Я правильно понимаю?

Как выполнить такую ​​операцию с three.js?

Я пробовал перемножать разные (перевод / поворот) матрицы друг на друга в three.js, но не получил желаемого результата :-(

Большое спасибо.

Question

Самый полезный комментарий

Что насчет этого?

var dummy = new THREE.Object3D();
dummy.position.x = 50;
dummy.position.z = 50;
scene.add( dummy );

var cube = new THREE.Mesh( new THREE.CubeGeometry( 100, 100, 100 ), new THREE.MeshBasicMaterial() );
cube.position.x = - 50;
cube.position.z = - 50;
dummy.add( cube );

Все 5 Комментарий

Что насчет этого?

var dummy = new THREE.Object3D();
dummy.position.x = 50;
dummy.position.z = 50;
scene.add( dummy );

var cube = new THREE.Mesh( new THREE.CubeGeometry( 100, 100, 100 ), new THREE.MeshBasicMaterial() );
cube.position.x = - 50;
cube.position.z = - 50;
dummy.add( cube );

Спасибо за ответ.

К сожалению, куб в вашем примере по-прежнему вращается вокруг своей локальной оси, проходящей через его центр, что бы я ни называл:

function rotateAroundObjectAxis( object, axis, radians ) { .. }

или же

function rotateAroundWorldAxis( object, axis, radians ) { .. }

Что я действительно хочу выяснить, так это то, как сместить ось вращения конкретного объекта.

Большое спасибо.

Вы пытались вращать манекен / контейнер вместо куба?

Хорошая точка зрения. Так работает.

Но почему не все так однозначно :-)?

Я думаю, это должна быть какая-то арифметика матриц с использованием функции, которую я предложил в моем первоначальном посте, или что-то более удобное.

function rotateAroundArbitraryAxis( object, axisDirection, axisBasePoint, radians ) { .. }

под axisBasePoint я имею в виду точку, через которую проходит указанная ось.

С наилучшими пожеланиями.

@oosmoxiecode Упс! Да, забыл об этом в моем фрагменте.

@Landlord Ну, для меня это просто. Это даже не требует знания матриц;) Я думаю, это просто вопрос мышления по-другому ... В любом случае, внутри происходят одни и те же вычисления матриц.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги