在3D平面上的点

时间:2013-05-18 16:18:27

标签: 3d unity3d coordinate-systems plane

我正试图找出一种使用Unity3D在面向相机的3D平面上移动物体的方法。我希望这些对象被约束到平面,平面本身可以在3D空间中移动(摄像机跟随它)。

为此,我想我会使用飞机的坐标系来移动物体。我认为平面上的x,y坐标在实际3D空间中具有对应的x,y,z坐标。问题是,我无法弄清楚如何在该平面上访问,使用或计算(x,y)坐标。

我做过一些研究,我遇到了矢量和法线等,但我不明白它们与我的特定问题有什么关系。如果我在正确的地方寻找,你能解释一下吗?如果我不是,你能指出我正确的方向吗?非常感谢。

2 个答案:

答案 0 :(得分:1)

  

我以为我会使用飞机的坐标系来移动   对象

这是要走的路。

  

我认为平面上的x,y坐标会有一个对应的坐标   实际3D空间中的x,y,z坐标。问题是,我无法弄清楚   如何在该平面上访问,使用或计算(x,y)坐标。

是的,这是真的。但是Unity3D使您可以访问相当高级别的函数,因此您不必明确地进行任何计算。

GameObjects设为Plane的子项,并使用本地坐标系移动它们。

例如:

childObj.transform.parent = plane.transform;
childObj.transform.localPosition += childObj.transform.forward * offset;

上面的代码使childObj成为平面GameObject的子节点,并将其向前移动到其局部坐标系中的偏移量。

答案 1 :(得分:0)

@Heisenbug:

#pragma strict

var myTransform : Transform; // for caching
var playfield : GameObject;
playfield = new GameObject("Playfield");
var gameManager : GameManager; // used to call all global game related functions
var playerSpeed : float;
var horizontalMovementLimit : float; // stops the player leaving the view
var verticalMovementLimit : float;
var fireRate : float = 0.1; // time between shots
private var nextFire : float = 0; // used to time the next shot
var playerBulletSpeed : float;



function Start () 
{
    //playfield = Playfield;
    myTransform = transform; // caching the transform is faster than accessing 'transform' directly
    myTransform.parent = playfield.transform;
    print(myTransform.parent);
    myTransform.localRotation = Quaternion.identity;

}

function Update () 
{
    // read movement inputs
    var horizontalMove = (playerSpeed * Input.GetAxis("Horizontal")) * Time.deltaTime;
    var verticalMove = (playerSpeed * Input.GetAxis("Vertical")) * Time.deltaTime;
    var moveVector = new Vector3(horizontalMove, 0, verticalMove);
    moveVector = Vector3.ClampMagnitude(moveVector, playerSpeed * Time.deltaTime); // prevents the player moving above its max speed on diagonals

    // move the player
    myTransform.localPosition += moveVector;