2012-03-15 115 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被替換爲指向您希望成爲大理石左方向的矢量的世界空間座標。