2

我试图找出一种方法来移动面向相机的 3D 平面上的对象,使用Unity3D. 我希望这些对象被限制在平面上,它本身可以在 3D 空间中移动(相机跟随它)。

为此,我认为我会使用平面的坐标系来移动对象。我认为平面上的 x,y 坐标将在实际 3D 空间中具有相应的 x,y,z 坐标。问题是,我不知道如何访问、使用或计算该平面上的 (x,y) 坐标。

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

4

2 回答 2

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并将其移动到其局部坐标系中的偏移量。

于 2013-05-18T18:49:20.847 回答
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;
于 2013-05-22T03:39:32.153 回答