在unity中通过两个操纵点控制物体的位移,旋转和缩放

19 篇文章 0 订阅

1. 场景 中创建一个不均匀的方块。 然后创建小球。  我需要通过控制小球的相对位置来让方块跟随旋转。  不过这样的话如果小球是随意移动,物体也会在三个轴进行旋转。我想让它旋转的时候只沿着角度变化比较大的轴进行旋转。

          这样控制的话,会。。。稳一些吧。。。 因为假设实在手势交互中,两个小球是通过两个手控制,会很随意,,从而让旋转很乱。 这样贴近主要的旋转轴向进行旋转,我只要多旋转几次,就能保证准确度。

2.如图,通过调整2的位置,让中间的方块角度随着 1和2的相对角度变化而变化。  

实现代码如下

   public Transform Point01;
    public Transform Point02;
    public Transform Traget;
    private Quaternion _orgRotation;
    private Vector3 _orgPosition;

    private Vector3 _orgPoint01;
    private Vector3 _orgPoint02;

    void Start()
    {
        _orgRotation = Traget.rotation;
        _orgPosition = Traget.position;

        _orgPoint01 = Point01.position;
        _orgPoint02 = Point02.position;
    }

    void Update()
    {
        Vector3 direction = Point02.position - Point01.position;
        Vector3 orgDirection = _orgPoint02 - _orgPoint01;
        Vector3 normal = Vector3.Cross(orgDirection, direction).normalized;
        normal = CalculateZeroedVector(normal);
        Vector3 plane_direction01 = Vector3.ProjectOnPlane(direction, normal);
        Vector3 plane_direction02 = Vector3.ProjectOnPlane(orgDirection, normal);
        Quaternion temp = Quaternion.FromToRotation(plane_direction02, plane_direction01);
        Traget.rotation = temp * _orgRotation;
    }

    /**Finds nearest cardinal vector to a vector */
    public Vector3 CalculateZeroedVector(Vector3 vectorToZero)
    {
        var zeroed = new Vector3();
        float max = Mathf.Max(Mathf.Abs(vectorToZero.x), Mathf.Abs(vectorToZero.y), Mathf.Abs(vectorToZero.z));
        if (Mathf.Abs(vectorToZero.x) == max)
        {
            zeroed = (vectorToZero.x < 0) ? new Vector3(1, 0, 0) : new Vector3(-1, 0, 0);
        }

        if (Mathf.Abs(vectorToZero.y) == max)
        {
            zeroed = (vectorToZero.y < 0) ? new Vector3(0, 1, 0) : new Vector3(0, -1, 0);
        }

        if (Mathf.Abs(vectorToZero.z) == max)
        {
            zeroed = (vectorToZero.z < 0) ? new Vector3(0, 0, 1) : new Vector3(0, 0, -1);
        }

        return zeroed;
    }

3.思路是在计算旋转之前先对1 和2 的方向变化做投影。这样就可以投影到 X Y Z 中变化最大的轴。然后在这个投影面上计算旋转角。 

         中间需要计算哪个轴是变化最大的轴,就通过前后两次 方向,做  叉乘,就能得到  两个方向所在平面的法线。 将法线贴近 最近的轴,即CalculateZeroedVector 方法。就可以得到要旋转的平面了,,只要把前后的方向投影过来,,计算旋转,就OK啦。

4.开始做这个功能是直接计算了前后两个方向 做的旋转,然后让对象做相同的旋转,,旋转之后准备通过欧拉角得到变化最大的轴,然后贴过去。。结果不行。。欧拉角  变化,,0和360是一个位置,,比较大小实在是不准呀。。。。

                    

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值