Я пытаюсь создать игру в бильярд, и я хочу рассчитать направление движения мяча (белого шара) после того, как он ударит по другому шару.Unity3D: Найти направление Raycasthit
Как вы можете видеть, что я хочу вычислить угол/направление, в котором RAY ударяется мяч и угол/направление, на котором raycast изменит свое направление в. Мне нужен угол для отображения в виде переменной Vector3, поэтому я могу использовать его на linerenderer (3).
Я уже рассчитал направление, в которое попадет мяч.
Если бы вы могли помочь мне в этом, это было бы здорово!
Текущий код:
RaycastHit hitz;
if (Physics.SphereCast(transform.position, 0.8f, location - transform.position, out hitz, Mathf.Infinity, lmm2))
{
lineRenderer2 = hitz.collider.GetComponentInChildren<LineRenderer>();
lineRenderer2.SetVertexCount(2);
if (!Input.GetKey(KeyCode.Mouse0))
lineRenderer2.SetPosition(0, hitz.point);
if (!Input.GetKey(KeyCode.Mouse0))
{
Vector3 start = hitz.point;
Vector3 end = start + (-hitz.normal * 4);
if (lineRenderer2)
{
if (!Input.GetKey(KeyCode.Mouse0))
lineRenderer2.SetPosition(1, end);
}
if(lineRenderer3)
{
anglelel = Vector3.Angle(hitz.normal, hitz.point);
Vector3 cross = Vector3.Cross(hitz.normal, hitz.point);
if(cross.y > 0)
{
tzt = Quaternion.AngleAxis(90f, hitz.normal) *realStick.transform.forward;
}
if (cross.y < 0)
{
anglelel = -anglelel;
tzt = Quaternion.AngleAxis(270f, hitz.normal) * realStick.transform.forward;
}
Vector3 start2 = hitz.point;
Vector3 end2 = start2 + ((tzt) * 5f);
lineRenderer3.SetPosition(0, hitz.point);
lineRenderer3.SetPosition(1, end2);
}
}
}
Спасибо за ваше время.
Edit:
Эта часть кода была изменена на этом, в настоящее время makign некоторый прогресс, но все же, это не достаточно хорошо. Перед
if(lineRenderer3)
{
Vector3 start2 = hitz.point;
//THIS IS WHERE I'M CURRENTLY STUCK AT
Vector3 end2 = start2 + (hitz.point * 0.7f);
lineRenderer3.SetPosition(0, hitz.point);
lineRenderer3.SetPosition(1, end2);
}
После
if(lineRenderer3)
{
anglelel = Vector3.Angle(hitz.normal, hitz.point);
Vector3 cross = Vector3.Cross(hitz.normal, hitz.point);
if(cross.y > 0)
{
tzt = Quaternion.AngleAxis(90f, hitz.normal) *realStick.transform.forward;
}
if (cross.y < 0)
{
anglelel = -anglelel;
tzt = Quaternion.AngleAxis(270f, hitz.normal) * realStick.transform.forward;
}
Vector3 start2 = hitz.point;
Vector3 end2 = start2 + ((tzt) * 5f);
lineRenderer3.SetPosition(0, hitz.point);
lineRenderer3.SetPosition(1, end2);
}
Это больше проблема физики, чем строго кодирование игры. Если вы пытаетесь визуализировать результат применения силы в этой точке бильярдного шара, вам нужно выполнить вычисления, используя его физические атрибуты, а не только такие, как лицевые нормали. Вот концепция, чтобы вы начали - вам нужно перевести ее в код: http://physics.stackexchange.com/questions/43232/force-applied-off-center-on-an-object – Serlite
Не совсем то, что Я искал. Проблема, о которой они говорят, находится в 2D-пространстве, в то время как моя игра в 3D. – Ssiro
Ваша игра отображается в 3D, но если ваша бильярдная таблица не плоская, вся физика может быть упрощена до 2D, так как все они останутся на плоскости XZ. – Serlite