2012-03-15 3 views
1

좋아, 간다! 나는 C#을 사용할 수 있지만 Unity에 주로 자바 코드를 사용하고있다.3d 구 주위 공 이동

내 게임에서 플레이어는 볼 물리학 (ballbody)을 적용하고 볼록 물리학을 적용하고 콜리슨 (collison)으로 작업을 완료했으며 행성 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

+3

우주 주위의 공이 아닌 공 주위로 우주를 이동하십시오. –

+0

[이 Arcball 구현] (http://nehe.gamedev.net/tutorial/arcball_rotation/19003/)에도 관심이있을 수 있습니다. – Shai

답변

0

Vector3.leftVector3.forward[-1,0,0][0,0,-1] 같은 상수가 정확한지? 이 경우 대리석의 기수와 관련하여 조정 된 벡터로 대체해야하는 것처럼 보입니다. Vector3.left은 대리석의 왼쪽 방향이 될 방향으로 향하는 벡터의 월드 공간 좌표로 대체됩니다.