Как я могу получить нормальное лицо после вращения? - PullRequest
0 голосов
/ 22 января 2020

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

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

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

1 Ответ

0 голосов
/ 22 января 2020

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

function computeNormal(p,face) {
    let n=face.normal
    let r=p.rotation
    n.applyEuler(r)
    console.log(n)
    return n
}
...