2012-03-15 70 views
1

好的,在这里!我使用的是Unity,主要是java代码,尽管也可以使用c#。围绕3d球体的球运动

在我的游戏中,玩家控制一个球(刚体),应用球物理并使用collisons完成工作,并且必须引导自己围绕一颗行星Mario Galaxy esque。

我遇到的问题是,控制系统似乎与我正在紧张的事情相反,取决于我在这个星球上的位置。有没有办法来约束控制系统,使无论什么行星或照相机的方向,向上是永远向前,向左总是留给等等

I have found some documentation regarding spherical corodinate systems,但我不确定这是否是要走的路如果我会过度复杂的事情。

代码用来保持球员球星球:`/ *

FauxGravityAttractor.js 

// Set to true for mono-directional gravity 
var useLocalUpVector : boolean = false; 

// Force applied along gravity up-vector (negative = down) 
var fauxGravity = -10.0; 

function Attract (body : FauxGravityBody){ 

    var gravityUp : Vector3; 
    var localUp: Vector3; 
    var localForward : Vector3; 

    var t : Transform = body.transform; 
    var r : Rigidbody = body.rigidbody; 


    // Figure out the body's up vector 

    if(useLocalUpVector){ 
     gravityUp = transform.up; 

    } else { 

     gravityUp = t.position - transform.position; 
     gravityUp.Normalize(); 
    } 



    // Accelerate the body along its up vector 

    r.AddForce(gravityUp * fauxGravity * r.mass); 
    r.drag = body.grounded ? 1 : 0.1; 



    // If the object's freezerotation is set, we force the object upright 

    if(r.freezeRotation){ 

     // Orient relatived to gravity 

     localUp = t.up; 
     var q = Quaternion.FromToRotation(localUp, gravityUp); 
     q = q * t.rotation; 
     t.rotation = Quaternion.Slerp(t.rotation, q, 0.1); 
     localForward = t.forward; 

    } 

}' 

和球的运动脚本:

using UnityEngine; 
using System.Collections; 

public class MarbleControl : MonoBehaviour { 



public float movementSpeed = 6.0f; 

void Update() { 

    Vector3 movement = (Input.GetAxis("Horizontal") * Vector3.left * movementSpeed) + (Input.GetAxis("Vertical") * -Vector3.forward *movementSpeed); 

    rigidbody.AddForce(movement, ForceMode.Force); 
} 

void OnTriggerEnter (Collider other ) { 

    if (other.tag == "Pickup") 

    { 

     MarbleGameManager.SP.FoundGem(); 

     Destroy(other.gameObject); 

    }  

} 

}

你的帮助是非常赞赏。

干杯山姆

+0

这真的取决于你如何影响球的运动。你能提供更多的细节 - 甚至可能有些代码?你如何让球移动?你如何确保它保持在这个星球上?总之,听起来你的控件基于aboslute坐标/世界空间,而不是相对于球的局部对象空间。 – Supr 2012-03-15 14:25:45

+3

将宇宙移动到球的周围而不是宇宙周围的球。 – 2012-03-15 14:27:40

+0

您可能会对[此Arcball实现]感兴趣(http://nehe.gamedev.net/tutorial/arcball_rotation/19003/) – Shai 2012-03-15 14:37:21

回答

0

Vector3.leftVector3.forward[-1,0,0][0,0,-1]常数是否正确?在这种情况下,看起来你需要用相对于大理石组织的协调的矢量来替换它们,例如, Vector3.left被替换为指向您希望成为大理石左方向的矢量的世界空间坐标。