Я процедурно генерирую травяные квады путем радиопередачи на поверхность местности, чтобы они казались более органичными c Я хотел бы добавить случайное вращение на Z, но каждая из моих попыток вращает травяной блок совершенно дико .
без случайного поворота по z, блоки травы хороши на местности, но выровнены, что не очень органично c
void RaycastItem(ItemChunk itemChunk)
{
RaycastHit hit;
Vector3 randPosition = new Vector3(Random.Range(-gridSize/2, gridSize/2), -20, Random.Range(-gridSize/2, gridSize/2)) + itemChunk.coord;
if (Physics.Raycast(randPosition, Vector3.down, out hit, raycastDistance))
{
Quaternion spawnRotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
Vector3 overlapTestBoxScale = new Vector3(overlapTestBoxSize, overlapTestBoxSize, overlapTestBoxSize);
Collider[] collidersInsideOverlapBox = new Collider[1];
int numberOfCollidersFound = Physics.OverlapBoxNonAlloc(hit.point, overlapTestBoxScale, collidersInsideOverlapBox, spawnRotation, spawnedObjectLayer);
if (numberOfCollidersFound == 0)
{
Pick(itemChunk, hit.point, spawnRotation);
}
}
}
void Pick(ItemChunk itemChunk, Vector3 positionToSpawn, Quaternion rotationToSpawn)
{
int randomIndex = Random.Range(0, itemsToPickFrom.Length);
GameObject item = itemsToPickFrom[randomIndex];
// this is one of the places I tried applying the random rotation
rotationToSpawn *= Quaternion.Euler(item.transform.rotation.x, item.transform.rotation.y, item.transform.rotation.z + Random.Range(0, 360));
GameObject clone = Instantiate(item, positionToSpawn, rotationToSpawn);
clone.transform.parent = itemChunk.transform;
Debug.Log(clone.transform.localScale);
}
Вот изображение того, что происходит
Что-то не так в моих кватернионных преобразованиях? Это относится к инстанциации? для практических задач мне пришлось поместить Quad внутри Empty, чтобы сделать префаб, Quad имеет 0 вращений / преобразований, а Quad имеет поворот на 90 градусов.