树洞中的狐狸 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 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题