【问题标题】:Ball movement around 3D sphere围绕 3D 球体的球运动
【发布时间】:2012-03-15 14:17:36
【问题描述】:

虽然也可以使用 C#,但我使用 Unity,主要是 Java 来编写代码。

在我的游戏中,玩家控制一个球(刚体),应用了球的物理原理并与碰撞一起工作,您必须引导自己绕着一个马里奥银河系的星球。

我遇到的问题是,根据我在地球上的位置,控制系统似乎与我所按的相反。有没有办法约束控制系统,使无论行星或相机的方向如何,向上总是向前,向左总是向左等等。

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

        }    

    }
}

【问题讨论】:

  • 这真的取决于你如何影响球的运动。你能提供更多细节 - 甚至是一些代码吗?怎么让球动起来?你如何确保它留在地球上?简而言之,听起来您的控件是基于绝对坐标/世界空间,而不是相对于球的局部对象空间。
  • 围绕球移动宇宙,而不是围绕宇宙移动球。
  • 您可能还会对this Arcball implementation感兴趣

标签: java c# coordinates game-physics


【解决方案1】:

Vector3.leftVector3.forward 是像 [-1,0,0][0,0,-1] 这样的常量,对吗?在这种情况下,您似乎需要用相对于大理石的方向协调的向量替换它们,例如Vector3.left 被替换为向量的世界空间坐标,该向量指向您希望成为大理石左侧方向的方向。

【讨论】:

    猜你喜欢
    • 2015-04-07
    • 1970-01-01
    • 2012-12-11
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 2014-01-27
    相关资源
    最近更新 更多