UGC编辑器开发-代码实现物体旋转操作轴

2023-12-23 20:45:39

1.视频效果:

工程百度网盘链接:

链接:https://pan.baidu.com/s/1OYkt2T3Wv_Hh0Bt7nLyR-A?
提取码:1212

2.设计思路:

我们从鼠标点击的屏幕坐标打出一根射线,求出射线和旋转面的交点,交点减去原点,求出向量,再用Vector3.SignedAngle求出与第一次点击时初始向量的大小角度对比,最终获得当前帧的旋转分量。

3.关键代码:

    public void CalculateClickPos()
    {
        //屏幕坐标转世界
        curFrameRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        curFramePos = CalculateRayPlaneIntersection(curFrameRay.origin, curFrameRay.origin-Camera.main.transform.position, transform.up, transform.position);
        dragVec = curFramePos - transform.position;
        curFrameAngle = Vector3.SignedAngle(transform.forward, dragVec,transform.up);
    }


    /// <summary>
    /// 求射线和平面的交点
    /// </summary>
    /// <param name="rayOrigin"></param>
    /// <param name="rayDirection"></param>
    /// <param name="planeNormal"></param>
    /// <param name="pointOnPlane"></param>
    /// <returns></returns>
    public Vector3 CalculateRayPlaneIntersection(Vector3 rayOrigin, Vector3 rayDirection, Vector3 planeNormal, Vector3 pointOnPlane)
    {
        float dot = Vector3.Dot(planeNormal, rayDirection);

        // 确保射线不平行于平面
        if (Mathf.Abs(dot) > 0.0001f)
        {
            // 计算射线和平面的交点参数
            float t = Vector3.Dot(pointOnPlane - rayOrigin, planeNormal) / dot;

            // 计算交点
            Vector3 intersectionPoint = rayOrigin + t * rayDirection;

            return intersectionPoint;
        }

        // 如果射线平行于平面,返回 Vector3.zero 表示没有交点
        return Vector3.zero;
    }

文章来源:https://blog.csdn.net/ysn11111/article/details/135159997
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。