我正试图找出一种使用Unity3D
在面向相机的3D平面上移动物体的方法。我希望这些对象被约束到平面,平面本身可以在3D空间中移动(摄像机跟随它)。
为此,我想我会使用飞机的坐标系来移动物体。我认为平面上的x,y坐标在实际3D空间中具有对应的x,y,z坐标。问题是,我无法弄清楚如何在该平面上访问,使用或计算(x,y)坐标。
我做过一些研究,我遇到了矢量和法线等,但我不明白它们与我的特定问题有什么关系。如果我在正确的地方寻找,你能解释一下吗?如果我不是,你能指出我正确的方向吗?非常感谢。
答案 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;