Прежде чем я начну, я понимаю, что это дублирующий вопрос. Однако для другого не было однозначного ответа, просто обходной путь, который мне не подходит.
Я строю кубик Рубика, используя три. js. Чтобы создать реалистичные повороты c, я поворачиваю их вокруг точки. Функция, которую я использую здесь:
THREE.Object3D.prototype.rotateAroundWorldAxis = function () {
// rotate object around axis in world space (the axis passes through point)
// axis is assumed to be normalized
// assumes object does not have a rotated parent
var q = new THREE.Quaternion();
return function rotateAroundWorldAxis(point, axis, angle) {
q.setFromAxisAngle(axis, angle);
this.applyQuaternion(q);
this.position.sub(point);
this.position.applyQuaternion(q);
this.position.add(point);
return this;
}
}();
Я также построил ручную функцию для вычисления нормалей лица из 3 точек. Я понимаю, что три. js имеет один из них, это просто мой процесс отладки. Он работает просто отлично, но когда я поворачиваю грань кубика Рубика с помощью функции, ни встроенных нормалей, ни мои функции дают правильное направление, они просто возвращают направление, в котором они были изначально. Моя функция для нормалей ниже.
function computeNormal(p,face) {
let a=p.geometry.vertices[face.a]
let b=p.geometry.vertices[face.b]
let c=p.geometry.vertices[face.c]
let d=new THREE.Vector3(0,0,0)
d.crossVectors(b.sub(a),c.sub(a))
console.log(a,b,c,d)
return d.normalize()
}
Любая помощь приветствуется, и если вам нужны какие-либо другие части моего кода, я с радостью предоставлю