• Unity求物体关于平面镜像对称后坐标以及旋转


    前言:如题,我在已知一个平面L和物体A,我希望得到镜像后的物体B的位置和旋转。

    效果:

    推导:

    首先我们需要知道物体的对称坐标A',我们现在能已知A坐标以及平面L的法线,如果我们能得到B的坐标,我们可以根据中点公式C=1/2(a+b),反推得到对称点A',所以我们现在需要求出B点的坐标。

    常规数学上的思路:根据平面L=ax+by+cz+d(a,b,c,d都是已知),法向量是(a,b,c),并且已知A点的坐标,我们用点向式去表示直线AB,我们能得知方向向量就是平面L的法向量,再已知过点A,我们就能知道直线AB,然后联立求直线和平面L的交点就能知道B点。

    但在Unity里面,我们得不到平面的公式,只能得知平面的法向量以及平面上的某一点。所以我们可以通过点乘去得到想要的坐标。比如下面S假设是L的单位法向量,C是平面上的任意一点,我们可以借助Vector3.Dot求出AB的长度,再乘以单位法向量知道AB向量,最终得到B点的坐标。

    求出对称后的坐标,还需要求对称后的旋转,我们只要确定两个轴的朝向就能确定旋转。数学上的常规思路比较复杂,有兴趣可以查查,这里就不在赘述。在Unity里面我们知道物体的局部坐标系,比如A的Z轴,如果求出反射向量Z' ,那么物体A’的Z轴指向的其实就是反射向量Z',这句话很关键。然后我们同理求出A’的y轴的指向就能最终确定A'的旋转。

    代码:

    1. public class Test : MonoBehaviour
    2. {
    3. //目标物
    4. public GameObject target1;
    5. //镜像物体
    6. public GameObject target2;
    7. //平面
    8. public GameObject panel;
    9. private void Update()
    10. {
    11. //求中心点
    12. Vector3 centerPos =
    13. ProjectPointOntoPlane(target1.transform.position, panel.transform.position, panel.transform.up);
    14. //求镜像坐标点
    15. target2.transform.position = 2 * centerPos - target1.transform.position;
    16. //求镜像旋转
    17. target2.transform.rotation = ProjectReflectRt(target1.transform, panel.transform.up);
    18. }
    19. // 计算点在平面上的投影坐标(目标点,平面上一点,平面的单位法向量)
    20. private Vector3 ProjectPointOntoPlane(Vector3 point, Vector3 planePoint, Vector3 planeNormal)
    21. {
    22. // 计算投影向量
    23. Vector3 projectionVector = point - planePoint;
    24. float distance = Vector3.Dot(projectionVector, planeNormal);
    25. return point - distance * planeNormal;
    26. }
    27. //计算对称后的旋转
    28. private Quaternion ProjectReflectRt(Transform target,Vector3 planeNormal)
    29. {
    30. Vector3 up = target.transform.up;
    31. Vector3 forward = target.transform.forward;
    32. Vector3 symmetricUp = Vector3.Reflect(up, planeNormal).normalized;
    33. Vector3 symmetricForward = Vector3.Reflect(forward, planeNormal).normalized;
    34. return Quaternion.LookRotation(symmetricForward, symmetricUp);
    35. }
    36. }

  • 相关阅读:
    Office 2016、2019 解决“你的 Office 许可证有问题”
    云环境风险评估技术
    漫画sql数据分析
    【MySql 中的 WHEN CASE 与 IF ELSE】
    记一次路由器频繁掉线问题的分析、解决与发展
    统计数字会撒谎
    Android绘制的Window和View
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校心理咨询管理系统0e78p
    MySQL数据库复习——索引
    学生成绩查询(查最大值,最小值,平均值,升序,降序)
  • 原文地址:https://blog.csdn.net/ysn11111/article/details/136158890