Я пытаюсь создать вид ориентации blender-esk, который выглядит следующим образом, используя Three JS:
Мой план состоит в том, чтобы возьмите поворот камеры и поверните 3 векторных точки (представляющих X, Y и Z пузыри на рисунке). Затем, получив эти точки, я могу использовать координаты X и Y, чтобы нарисовать круги на холсте и нарисовать линии, чтобы соединить их с центром. Затем я могу использовать направление Z, чтобы определить, что должно быть нарисовано поверх чего.
В настоящее время я использую сцену 2-й три. js, чтобы визуализировать положение этих точек X, Y и Z как Я пытаюсь разными способами повернуть группу вершин, чтобы она соответствовала ориентации камеры. Я борюсь с этой частью, и я попробовал кучу вещей, которые не сработали.
Вот JS Fiddle для того, где я сейчас нахожусь:
https://jsfiddle.net/j9mcL0x4/4/ (не загружается в Brave, но работает в Chrome)
Когда вы перемещаете камеру, она перемещает 3 куба во 2-й сцене но я не могу заставить его вращаться правильно.
Точки X, Y и Z представлены группой Vector3 как:
this.ref = [
[new THREE.Vector3(1,0,0), 0xFF0000],
[new THREE.Vector3(0,1,0), 0x00FF00],
[new THREE.Vector3(0,0,1), 0x0000FF],
]
Затем я создаю каждый куб и добавляю его в группа:
this.group = new THREE.Group();
for(var pos of this.ref) {
var geometry = new THREE.BoxGeometry(.25,.25,.25);
var material = new THREE.MeshBasicMaterial({
color: pos[1]
});
var cube = new THREE.Mesh(geometry, material);
cube.position.copy(pos[0]);
this.group.add(cube);
}
this.scene.add(this.group);
Затем в своей функции анимации я пытаюсь вычислить вращение для группы, чтобы она была в той же ориентации, что и основной вид:
var quaternion = new THREE.Quaternion();
camera.getWorldQuaternion( quaternion );
let rotation = new THREE.Euler();
rotation.setFromQuaternion(quaternion);
var dir = new THREE.Vector3();
dir.subVectors( camera.position, controls.target ).normalize();
orientationHelper.group.rotation.set(dir.x, dir.y, dir.z);
orientationHelper.animate();
То, что у меня есть, совершенно неправильно, но вот некоторые вещи, которые я пробовал:
- Рассчитайте точку перед камерой, затем используйте ее, чтобы заставить группу смотреть в этом направлении, используя lookAt function
- Я использую элементы управления орбитой, цель которой сфокусирована на камере. Я попытался вычесть вектор положения камеры и целевой вектор, чтобы получить направление взгляда, но это не сработало (что сейчас находится в jsfiddle)
- Я попытался использовать только локальное вращение камеры (и попытался отменить это)
Примечание Я мог бы повернуть камеру во 2-й сцене, чтобы соответствовать камере на главном виде, но я действительно хочу вращать сами векторы. Поэтому я могу взять эти точки и спроецировать их на основание c, чтобы нарисовать 6 кругов и 3 линии. Я чувствую, что это будет намного проще, чем пытаться использовать спрайты в 3d, и Три JS не могут легко рисовать толстые линии, не создавая прямоугольные angular сетки для этого.
Вот несколько примеров того, как должен выглядеть вывод:
Обновление
Эта проблема была решена Rabbid76, и если кто-то заинтересован в использовании ориентационного куба Blender Style для своего проекта, вы можете найти полный исходный код здесь:
https://github.com/jrj2211/three-orientation-gizmo/