Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

169
Views
El objeto no se mueve a otro hemisferio en la unidad.

Estoy tratando de darme cuenta de que me muevo en un objeto alrededor de la esfera (caminar sobre él), pero cuando llega al ecuador de la esfera, deja de moverse.

 public Transform planet; public bool AlignToPlanet; public float gravityConstant = -9.8f; void FixedUpdate() { Vector3 toCenter = planet.position - transform.position; toCenter.Normalize(); GetComponent<Rigidbody>().AddForce(toCenter * 9.8f, ForceMode.Acceleration); if (AlignToPlanet) { Quaternion q = Quaternion.FromToRotation(-transform.up, -toCenter); q = q * transform.rotation; transform.rotation = Quaternion.Slerp(transform.rotation, q, 1); } Debug.Log(CrossPlatformInputManager.GetAxis("Vertical")); GetComponent<Rigidbody>().AddForce(transform.forward * 2, ForceMode.Impulse); }
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

En primer lugar, debe evitar llamar a GetComponent más de lo necesario. Simplemente llámelo una vez para obtener Rigidbody en Awake y luego consulte el resultado en FixedUpdate .

En segundo lugar, una vez que determine la dirección hacia arriba del objeto, puede usar productos cruzados para determinar cuál sería el avance más cercano al anterior mientras lo mantiene arriba.

Luego, puede usar Quaternion.LookRotation para configurarlo y reenviarlo.

Finalmente, debe usar Rigidbody.MoveRotation para establecer la rotación.

En total:

 private Rigidbody rb; public Transform planet; public bool AlignToPlanet; public float gravityConstant = -9.8f; void Awake() { rb = GetComponent<Rigidbody>(); } void FixedUpdate() { Vector3 toCenter = planet.position - transform.position; toCenter.Normalize(); rb.AddForce(toCenter * 9.8f, ForceMode.Acceleration); if (AlignToPlanet) { Vector3 newUp = -toCenter; Vector3 newRight = Vector3.Cross(newUp, transform.forward); Vector3 newForward = Vector3.Cross(newRight, newUp); Quaternion newRot = Quaternion.LookRotation(newForward, newUp); rb.MoveRotation(q); } Debug.Log(CrossPlatformInputManager.GetAxis("Vertical")); rb.AddForce(transform.forward * 2, ForceMode.Impulse); }
over 4 years ago · Santiago Trujillo Report

0

Configuré un nuevo proyecto con su script, y funciona bien para mí.

Las únicas cosas que cambié (además de AddForce en el reenvío para probarlo) son:

  • El FromToRotation en el que pasas vectores opuestos (uno hacia arriba y otro hacia abajo)
  • El Slerp lo eliminé, no sirve de nada ya que le pasa un valor de 1.

Entonces, se ve así:

 if (AlignToPlanet) { // removed the minus in front of toCenter Quaternion q = Quaternion.FromToRotation(-transform.up, toCenter); transform.rotation = q * transform.rotation; }

EDITAR
Estoy de acuerdo con @Ruzhim: LookRotation es una mejor manera de calcular su nueva rotación, ya que también toma el avance de su objeto. (Y por el hecho de no usar el GetComponent en ninguna Actualización)

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!