Прежде чем я начну, я понимаю, что это повторяющийся вопрос. Однако на другой не было однозначного ответа, просто обходной путь, который ко мне не относится.
Я строю кубик Рубика, используя three.js. Чтобы создать реалистичные вращения, я поворачиваю их вокруг точки. Функция, которую я использую, находится здесь:
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 точкам. Я понимаю, что в three.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()
}
Любая помощь приветствуется, и если вам нужны какие-либо другие фрагменты моего кода, я буду рад предоставить