Страница 1 из 1

Как определить "выпавшую" сторону после броска кубика

СообщениеДобавлено: 23 мар 2017, 12:37
iGefest
Всем привет. Опять в тупике. Есть модель игральной кости (1d6). К нему прикреплен скрипт броска:
Синтаксис:
Используется csharp
using System.Collections;
using UnityEngine;

public class ApplyForceInRandomDirection : MonoBehaviour
{
        public string buttonName = "Fire1";
        public float forceAmount = 10.0f;
        public float torqueAmount = 10.0f;
        public ForceMode forceMode;
        // Update is called once per frame
        void Update ()
        {
                Rigidbody rb = GetComponent<Rigidbody> ();
                if (Input.GetButtonDown (buttonName))
                {
                        rb.AddForce(Random.onUnitSphere * forceAmount, forceMode);
                        rb.AddTorque(Random.onUnitSphere * torqueAmount, forceMode);
                }
                       
        }
}
 


Изображение

Нужно определить какая сторона выпала и вывести ее в консоль. Видел много где реализацию такого вида:
Синтаксис:
Используется csharp
if (Vector3.Dot (transform.forward, Vector3.up) &gt; 1)
diceCount = 5;
if (Vector3.Dot (-transform.forward, Vector3.up) &gt; 1)
diceCount = 2;
if (Vector3.Dot (transform.up, Vector3.up) &gt; 1)
diceCount = 3;
if (Vector3.Dot (-transform.up, Vector3.up) &gt;1)
diceCount = 4;
if (Vector3.Dot (transform.right, Vector3.up) &gt;1)
diceCount = 6;
if (Vector3.Dot (-transform.right, Vector3.up) &gt;1)
diceCount = 1;
Debug.Log ("diceCount :" + diceCount);

 


Но так и не смог понять ее принцип работы и как заставить его работать.
Собственно вопрос каким образом можно считать выпавшую грань и что гуглить. Спасибо.

Re: Как определить "выпавшую" сторону после броска кубика

СообщениеДобавлено: 23 мар 2017, 12:57
ikhtd
нужно вешать какой то признак на каждую грань, к примеру рейкаст. например такой алгоритм- не определять ту которая выпала, а определять противоположную грань с помощью рейкаста. это единственная грань которая имеет контакт с полом. рейкаст конечно ставить не в апдейте, запускать его только по признаку когда кубик полностью остановил движение - лег на пол. в этот момент считывать касается ли грань кубика к полу. на пол назначить какой то таг и определять касается ли рейкаст объекта с тагом. определили ту которая касается пола - значит выпала противоположная.
не знаю может есть какой алгоритм получше- это я сам выдумал. кстати можно не рекаст а тригеры на грани - так меньше возни.

Re: Как определить "выпавшую" сторону после броска кубика

СообщениеДобавлено: 23 мар 2017, 13:13
Tolking
Не понял т.к. не знаешь, что такое Дот продукт и когда он равен 1...

Re: Как определить "выпавшую" сторону после броска кубика

СообщениеДобавлено: 23 мар 2017, 13:14
MANMANA
Ориентация 3д объекта в пространстве задается тремя координатами по трем осям, в частности transform.forward, transform.up и transform.right определяет локальные направления лицевой, верхней и боковой поверхностей объекта.
Vector3.up и т.д. - направление мировых координат.
Vector3.Dot позволяет сравнить направление двух векторов (направлений объекта), например, transform.up и Vector3.up.
В приведенном вами примере сравниваются различные варианты ориентации/направления сторон объекта (transform.right и Vector3.up, transform.up и Vector3.up и т.д.), достаточных для определения того, какой стороной кубик направлен/повернут (up, forward, right), причем, в данном случае, достаточным является сравнение up и forward в нескольких комбинациях.
p.s. -transform.up это такой себе "transform.down"