You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ThreeJS问题:如何让Obj2围绕(0,0,0)处的Obj1正确轨道运动?

ThreeJS 轨道旋转问题修正方案

场景示意图

我已创建如图所示的ThreeJS场景,并编写了两个方法,用于让Obj2以指定distance围绕Obj1旋转。

function configureObj2PositionHorizontally(angleInDegree) {
  radianAngle = angleInDegree * oneDegreeInRadians;

  obj2Mesh.position.x = distance * Math.cos(radianAngle);
  obj2Mesh.position.z = distance * Math.sin(radianAngle);

  console.log(radianAngle, distance);
}

function configureObj2PositionVertically(angleInDegree) {
  radianAngle = angleInDegree * oneDegreeInRadians;

  obj2Mesh.position.y = distance * Math.sin(radianAngle);
  obj2Mesh.position.z = distance * Math.cos(radianAngle);

  console.log(radianAngle, distance);
}

当前问题是:当Obj2移动到类似pointA的位置时,尝试垂直旋转时会围绕Z轴旋转,而非中心点(0,0,0)。需让Obj2仅围绕位于(0,0,0)的Obj1轨道运动,该如何修正此行为?


修正方案

问题根源在于当前的两个方法独立修改单平面坐标,没有结合已有的空间角度,导致垂直旋转时脱离原点轨道。通过维护水平、垂直两个角度,基于球面坐标计算三维位置即可解决:

  1. 定义全局变量存储当前角度:
let horizontalAngle = 0; // 绕Y轴的水平方位角(单位:度)
let verticalAngle = 0;   // 绕X轴的垂直俯仰角(单位:度)
const oneDegreeInRadians = Math.PI / 180;
  1. 编写统一的位置更新函数,基于双角度计算笛卡尔坐标:
function updateObj2Position() {
  const horRad = horizontalAngle * oneDegreeInRadians;
  const verRad = verticalAngle * oneDegreeInRadians;

  // 先计算垂直角度约束后的X-Z平面半径
  const xzPlaneRadius = distance * Math.cos(verRad);
  // 计算X、Z轴坐标(水平旋转)
  obj2Mesh.position.x = xzPlaneRadius * Math.cos(horRad);
  obj2Mesh.position.z = xzPlaneRadius * Math.sin(horRad);
  // 计算Y轴坐标(垂直旋转)
  obj2Mesh.position.y = distance * Math.sin(verRad);
}
  1. 改写原有的两个控制方法,改为更新角度后调用统一更新函数:
function configureObj2PositionHorizontally(angleInDegree) {
  horizontalAngle = angleInDegree;
  updateObj2Position();
}

function configureObj2PositionVertically(angleInDegree) {
  verticalAngle = angleInDegree;
  updateObj2Position();
}

这种方式通过球面坐标转换,确保Obj2始终以指定距离围绕原点做三维轨道运动,无论水平或垂直旋转都不会偏离轨道。


内容的提问来源于stack exchange,提问作者Janith Ganewatta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 06:35:32