![alt text](https://i.imgur.com/AGOJTT9.png?1)
На изображении выше
- красный вектор - это прямой вектор паука
- синий вектор - это вектор, представляющий направление между паук и его цель
В приведенном ниже коде orientation
- это вектор, представляющий нормаль ландшафта, так что паук выравнивается по нему:
Vector3 orientation = GetTerrainNormal();
Quaternion rotationNeeded = Quaternion.FromToRotation(Vector3.up, orientation);
transform.rotation = Quaternion.RotateTowards(
transform.rotation,
rotationNeeded,
RotationSpeed * Time.deltaTime
);
Моя проблема в том, что мне не удается заставить паука стоять лицом к своей цели ... Когда я добавляю какой-либо код, который заставил бы его вращаться к нему, он больше не выровнен с нормалями ландшафта, он говорит прямо ...
Итак, в основном, как я могу заставить паука вращаться по мировой оси Y (я думаю), при этом все еще вращаясь, чтобы соответствовать наклону?
Полный ответ
In если это помогает кому-то другому, вот полный ответ:
Vector3 orientation = GetTerrainNormal();
Vector3 directionToTarget = (target.position - transform.position).Y(0);
float d = Vector3.Dot(directionToTarget, orientation);
directionToTarget -= d * orientation;
if (directionToTarget.sqrMagnitude > 0.00001f) {
directionToTarget.Normalize();
Quaternion rotationNeeded = Quaternion.LookRotation(directionToTarget, orientation);
transform.rotation = Quaternion.RotateTowards(
transform.rotation,
rotationNeeded,
xRotationSpeed * Time.deltaTime
);
}
Этот ответ на форумах единства был чрезвычайно полезен: https://forum.unity.com/threads/look-at-object-while-aligned-to-surface.515743/