尝试在实例化的预制件上应用 z 旋转未按预期工作
trying to apply z rotation on instantiated prefab not working as expected
我通过将光线投射到地形表面来按程序生成草地四边形,
为了让它们看起来更自然,我想在 Z 轴上添加一个随机旋转,但我的每一次尝试都会完全疯狂地旋转草方块。
没有随机 z 旋转,草方块在地形上很好,但排列整齐,感觉不太自然
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);
}
这是正在发生的事情的图片
我的四元数转换有问题吗?这是 Instantiation 特有的吗?
对于实际问题,我不得不将 Quad 放入 Empty 中以制作预制件,Quad 有 0 rotations/transforms 并且 Quad 有 90 度旋转。
试试这个:
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));
我通过将光线投射到地形表面来按程序生成草地四边形, 为了让它们看起来更自然,我想在 Z 轴上添加一个随机旋转,但我的每一次尝试都会完全疯狂地旋转草方块。
没有随机 z 旋转,草方块在地形上很好,但排列整齐,感觉不太自然
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);
}
这是正在发生的事情的图片
我的四元数转换有问题吗?这是 Instantiation 特有的吗? 对于实际问题,我不得不将 Quad 放入 Empty 中以制作预制件,Quad 有 0 rotations/transforms 并且 Quad 有 90 度旋转。
试试这个:
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));