Я делаю опыт работы с трубкой, используя три. У меня есть проблема, в которой 10% поездов не следуют вращению, как и ожидалось. Я попытался использовать Lookat () , однако это не сработало, поэтому создал эту пользовательскую функцию, см. Сплык ниже. Функция принимает три параметра, где из и до являются мировыми позициями от FromStation и tostation . Параметр TOL является толерантностью к точности, чтобы закрепить его в определенном направлении.
фрагмент кода:
const getDirection = (from, to) => {
const x = from.x - to.x
const y = from.y - to.y
const z = from.z - to.z
const total = (x + y + z) / 3
const dir = total < 0 ? -1 : 1
return dir
}
const getNormVal = (value, inv, tol) => {
const inversion = inv ? -1 : 1
if (value < tol && value > -tol) return 0
if (value < 0) return -1 * inversion
if (value > 0) return 1 * inversion
}
const getRotation = (from, to, tol) => {
const dir = new THREE.Vector3()
dir.x = getNormVal(from.x - to.x, false, tol)
dir.y = getNormVal(from.y - to.y, false, tol)
dir.z = getNormVal(from.z - to.z, false, tol)
let rotation = 0
if (dir.x === 1) rotation += 3.14
if (dir.z === -1 && dir.x === 0) rotation += 1.57
if (dir.z === 1 && dir.x === 0) rotation += -1.57
if (dir.x === 1 && dir.z !== 0) rotation += -0.785 * dir.z
if (dir.x === -1 && dir.z !== 0) rotation += 0.785 * dir.z
return rotation
}
< /code>
Изображение:
Изображение ошибки вращения трубки < /p>
Подробнее здесь: https://stackoverflow.com/questions/796 ... in-threejs