Попытка применить вращение z на конкретный сборный не работает, как ожидалось - PullRequest
0 голосов
/ 01 мая 2020

Я процедурно генерирую травяные квады путем радиопередачи на поверхность местности, чтобы они казались более органичными 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);
}

Вот изображение того, что происходит enter image description here

Что-то не так в моих кватернионных преобразованиях? Это относится к инстанциации? для практических задач мне пришлось поместить Quad внутри Empty, чтобы сделать префаб, Quad имеет 0 вращений / преобразований, а Quad имеет поворот на 90 градусов.

1 Ответ

1 голос
/ 01 мая 2020

Попробуйте это:

rotationToSpawn = Quaternion.Euler(item.transform.rotation.x, item.transform.rotation.y, item.transform.rotation.z + Random.Range(-15, 15));

Если я получу то, что вы делаете, вы хотите, чтобы трава имела небольшое вращение по оси Z. Это должно сделать это. Если элемент уже имеет большое вращение по оси z, вы можете попробовать это:

rotationToSpawn = Quaternion.Euler(item.transform.rotation.x, item.transform.rotation.y, Random.Range(-15, 15));
...