弹簧接头与相对连接的锚

时间:2017-09-29 06:44:50

标签: c# unity3d

我正在尝试为弹球桌制作柱塞。它基本上是一个带有刚体和弹簧接头的立方体。当按下一个特定的键时,我试图向spring的connectedAnchor添加一些z值以移动立方体,当不再按下该键时,connectedAnchor将返回其原始位置。

问题是connectedAnchor操作发生在worldspace中,并且由于我的表被旋转,沿z轴移动立方体是不正确的。基本上我正在寻找的是一种影响连接锚点的方法,但是使用立方体变换的局部轴而不是世界空间轴。

要获取原始的connectedAnchor,我会检查“自动配置”,然后在我进行操作之前取消选中它。 enter image description here的统一文档说这应该有效,但事实并非如此。

Here's my script:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlungerController : MonoBehaviour {

    public float movement_increment_z;

    public float max_movement_z;

    private SpringJoint spring;
    private Vector3 orig_anchor;

    private void Start() {
        spring = GetComponent<SpringJoint>();
        if (!spring) { throw new System.Exception("spring joint is needed"); };
        orig_anchor = spring.connectedAnchor;
    }

    public void processPlungerInput (bool isKeyPressed) {
        Debug.Log(orig_anchor);
        if (isKeyPressed) {
            if (spring.connectedAnchor.z < max_movement_z) {
                spring.connectedAnchor += new Vector3(0,0,movement_increment_z);
            } else {
                spring.connectedAnchor = orig_anchor;
            }
        }
    }

}

除z轴运动外,刚体受到约束。

1 个答案:

答案 0 :(得分:1)

我最终采取了略微不同的方法。我没有更改弹簧的连接锚,而是将其保持不变,并将连接的主体设置为静态定位的原点变换。

按下键时,我暂时将弹簧设置为0,然后更改柱塞对象的位置。未按下按键时,我将弹簧设置为较高值,以便弹回到定位点。

要处理约束问题,而不是使用刚体检查器上的选项(它只锁定世界空间轴上的位置),我使用了一个脚本,它将旋转和x / y位置设置为每帧的原始值。

脚本现在看起来像这样:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlungerController : MonoBehaviour {

    public float movement_increment_z;

    public float max_movement_z;
    public float spring_power;

    private SpringJoint spring;
    private Vector3 orig_anchor;
    private Quaternion orig_rotation;
    private float orig_pos_x, orig_pos_y;

    private void Start() {
        spring = GetComponent<SpringJoint>();
        if (!spring) { throw new System.Exception("spring joint is needed"); };
        orig_anchor = spring.connectedAnchor;
        orig_rotation = transform.localRotation;
        orig_pos_y = transform.localPosition.y;
        orig_pos_x = transform.localPosition.x;
    }

    public void processPlungerInput (bool isKeyPressed) {
        if (isKeyPressed) {
            spring.spring = 0;
            if (transform.localPosition.z < max_movement_z) {
                transform.localPosition += new Vector3(0,0,movement_increment_z);
            }
        } else {
            spring.spring = spring_power;
        }
    }

    // preserve only z axis movement and no rotation at all.
    private void FixedUpdate() {
        transform.localRotation = orig_rotation;
        transform.localPosition = new Vector3(orig_pos_x, orig_pos_y, transform.localPosition.z);
    }

}