不使用四元数时如何获取朝向指定Vector3坐标的Vector3旋转值
无四元数相机朝向目标点欧拉角计算方案
不需要用四元数,纯基础向量运算+三角函数就能算出可直接赋值的Vector3旋转值,适配你射线检测拿碰撞点做目标的场景。
前置说明
绝大多数图形引擎/游戏引擎的原生相机欧拉角采用Z-X-Y顺规,无滚转需求时Z轴旋转值固定为0,以下计算默认基于这个通用规则,如果你用的引擎坐标系有差异,看后面的调整说明即可。
具体计算步骤
- 先计算相机到目标碰撞点的方向向量
直接做坐标差后归一化即可:// 伪代码,替换成你所用环境的对应接口就行 Vector3 direction = raycastHit.point - camera.transform.position direction = direction.Normalize() - 计算Y轴(水平转向)旋转角度
取方向向量在XZ水平面的投影,用反正切计算和正前方的夹角,记得转成角度单位:float yAngle = Math.Atan2(direction.x, direction.z) * Math.Rad2Deg - 计算X轴(俯仰)旋转角度
取方向向量的Y分量算俯仰角,注意Y轴向上的坐标系里要取负适配引擎的旋转方向:float xAngle = Math.Asin(-direction.y) * Math.Rad2Deg - Z轴旋转值直接设为0,普通观察相机不需要绕前进方向的滚转:
float zAngle = 0 - 拼接成Vector3直接赋值给相机旋转参数即可:
camera.transform.rotation = new Vector3(xAngle, yAngle, zAngle)
异常调整
如果赋值后朝向不对,按两个方向排查即可:
- 朝向水平偏转90度/反向:调整Atan2里x、z参数的顺序,或者交换xAngle、yAngle的赋值位置,适配你引擎的欧拉角顺规
- 俯仰上下反向:去掉Asin里direction.y前面的负号,适配你引擎的Y轴方向
这个方案没有用到任何四元数相关运算,只要环境支持基础三角函数和向量运算就能正常运行,射线返回的碰撞点坐标可以直接代入计算,不需要额外做坐标转换。
内容的提问来源于stack exchange,提问作者Dylan Hussain
相关产品推荐
相关产品推荐

