Как я могу получить нормальное лицо после поворота?

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

Я строю кубик Рубика, используя 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()
}

Любая помощь приветствуется, и если вам нужны какие-либо другие фрагменты моего кода, я буду рад предоставить


person John Williams    schedule 22.01.2020    source источник


Ответы (1)


Типично для меня работать над этим после того, как оно опубликовано! Я только что понял, что мы можем получить вращение части, содержащей лицо, и добавить его вращение к лицам (или что-то в этом роде). Обновленная функция:

function computeNormal(p,face) {
    let n=face.normal
    let r=p.rotation
    n.applyEuler(r)
    console.log(n)
    return n
}
person John Williams    schedule 22.01.2020
comment
Пожалуйста, измените, чтобы показать, как вы это сделаете, а затем примите свой ответ, если сообщение будет разрешено. - person isherwood; 22.01.2020