常用方案三进行模型控制
方案 1:直接用 lookAt
如果你的方向向量是从 A → B,那么可以用 lookAt
:
const dir = p2.clone().sub(p1).normalize(); // 世界方向向量
const target = p1.clone().add(dir); // 方向目标点mesh.lookAt(target); // 让模型的 -Z 轴朝向 target
⚠️ 注意:lookAt
默认让 物体的 -Z 轴 指向目标点(这是 Three.js 的约定)。
如果你希望模型的 +Z 轴 或 +X 轴 对齐,需要额外旋转一个偏移量。
方案 2:用四元数 setFromUnitVectors
如果你知道模型当前「前方」是哪个局部轴,可以用四元数来把它旋转到目标方向:
// 目标方向(XZ 平面,单位化)
const dir = p2.clone().sub(p1).setY(0).normalize();// 假设模型的“前方”是 +Z 轴
const forward = new THREE.Vector3(0, 0, 1);// 计算旋转四元数
const quat = new THREE.Quaternion().setFromUnitVectors(forward, dir);// 应用到模型
mesh.quaternion.copy(quat);
这样 mesh
就会旋转到朝向 p1 → p2
的方向。
方案 3:限制在 XZ 平面(常见于角色控制器)
如果你只想控制 Y 轴旋转(比如角色在地面上转向),可以这样:
const dir = p2.clone().sub(p1).setY(0).normalize();// 朝向角度(绕 Y 轴旋转)
const angle = Math.atan2(dir.x, dir.z); mesh.rotation.set(0, angle, 0); // 只改 Y