树洞中的狐狸 2022-02-07 12:13 采纳率: 100%
浏览 23
已结题

关于射线控制角色旋转的一些疑问

找到的一个制作纪念碑谷的项目,项目里写了一些node来控制角色移动,其中用这些代码实现当角色移动的让角色面向下一个结点。这个代码传入了当前角色所处的结点和下一个要经过的结点,然后将下一个结点的位置转为了屏幕空间,声明了一条射线从相机到这个屏幕空间的点,然后在角色脚底创建了一个平面,通过Raycast方法获取了到相机的距离,同时获取射线上这个距离点的坐标,用开始结点减去了这个坐标再让角色向这个坐标旋转。
我没有理解的是,为什么要通过这些步骤去获取这个坐标,而不是直接用开始坐标减去下一个坐标然后直接让角色旋转。
图中的黑点就是node,角色每次行走都会走到node的位置上。

img


```c#
public void FaceNextPosition(Vector3 startPosition, Vector3 nextPosition)
        {
            if (Camera.main == null)
            {
                return;
            }

            // convert next Node world space to screen space
            Vector3 nextPositionScreen = Camera.main.WorldToScreenPoint(nextPosition);

            // convert next Node screen point to Ray
            Ray rayToNextPosition = Camera.main.ScreenPointToRay(nextPositionScreen);

            // plane at player's feet
            Plane plane = new Plane(Vector3.up, startPosition);

            // distance from camera (used for projecting point onto plane)
            float cameraDistance = 0f;

            // project the nextNode onto the plane and face toward projected point
            if (plane.Raycast(rayToNextPosition, out cameraDistance))
            {
                Vector3 nextPositionOnPlane = rayToNextPosition.GetPoint(cameraDistance);
                Vector3 directionToNextNode = nextPositionOnPlane - startPosition;
                if (directionToNextNode != Vector3.zero)
                {
                    transform.rotation = Quaternion.LookRotation(directionToNextNode);
                }
            }
        }


  • 写回答

1条回答 默认 最新

  • 小鱼游戏开发 2022-02-07 15:35
    关注

    不直接 目标点 - 当前坐标 获得方向是因为有高低差
    直接使用该方向你会发现角色在上楼梯时是倾斜的
    所以,上面一段代码是先在脚下创建一个平面,然后 目标点投影到该平面上,再计算方向
    得到的旋转就只有Y轴了

    但是呢。你不妨尝试改变一下。例如说 Quaternion.LookRotation(目标点 - 当前坐标) 得到的结果 把X和Z轴归零

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 2月15日
  • 已采纳回答 2月7日
  • 创建了问题 2月7日

悬赏问题

  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持