Движение мяча вокруг 3D сферы - PullRequest
1 голос
/ 15 марта 2012

Я использую Unity и в основном Java для кода, хотя C # также может быть использован.

В моей игре игрок управляет шаром (твердым телом), применяя физику мяча и работая в полной мере с столкновениями, и вы должны вести себя вокруг планеты Марио Галактики.

Проблема, с которой я столкнулся, заключается в том, что система управления, кажется, делает противоположное тому, что я нажимаю, в зависимости от того, где я нахожусь на планете. Есть ли способ ограничить систему управления, чтобы независимо от ориентации планеты или камеры вверх всегда был вперед, слева всегда оставался и т. Д.

Я нашел некоторую документацию по сферическим системам кородината , но не уверен, что это будет путь, и если я буду слишком усложнять вопрос.

Код, используемый для удержания мяча игрока на планете:

    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);

        }    

    }
}

1 Ответ

0 голосов
/ 16 марта 2012

Vector3.left и Vector3.forward являются ли такие константы, как [-1,0,0] и [0,0,-1] правильными?В этом случае, похоже, вам нужно заменить их векторами, скоординированными относительно ориентации мрамора, так что, например, Vector3.left заменяется координатами мирового пространства вектора, указывающего направление, в котором вы хотите быть левым направлениеммрамор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...