以下代码来自我创建的快速游戏,用于测试Unity的功能。当检测到与另一个对象发生碰撞时,我有代码创建贴花。
问题是代码会创建贴面朝上(Y方向)。我已经尝试了一些解决方案,但无法使其旋转以面向与其撞击的对象相同的方向。
示例:一个物体撞击面向玩家的墙壁,显然我们希望贴花面向玩家。我的问题是他们都面朝上产生了。
我查看了一些有类似问题的旧问题,但无法让它合作,所以任何帮助都会很棒。
更新:也忘了提及正如指出的那样" Splat"是一个预制和GameObject类型的平面。还为上下文添加了问题照片。
else
{
Debug.Log ("collision detected");
//Instantiate (splat, transform.position, Quaternion.Euler(collision.gameObject.transform.forward));
Instantiate (splat, transform.position, Quaternion.LookRotation(collision.gameObject.transform.forward, collision.gameObject.transform.transform.up));
//destroy gameObject, timer seconds
Destroy(this.gameObject);
}
答案 0 :(得分:1)
但可能。
步骤1:获取发生碰撞的网格的三角形。根据{{3}},我们可以通过Raycast来做到这一点。这很简单。
第2步:获取此三角形的曲面法线。
Mesh mesh = meshCollider.sharedMesh;
Vector3[] normals = mesh.normals;
好的,好的。我们可以获得这些数据。据推测,我们想要的数组索引与步骤1中的RaycastHit.triangleIndex
值相同。使用简单网格(立方体,平面)进行一些测试只是为了确保。
第3步:旋转。为了匹配" up"你必须稍微玩这个。预制件上的方向。如果Y +为Y +,那么将Z +设为可见面是一个很容易的错误,只是因为数学变得更简单。
步骤4:考虑整个对象的世界空间轮换。为面部旋转splat预制件(在未旋转的对象上测试步骤3),添加应用于对象的旋转。
请注意,作为其他对象的子对象的对象可能会应用多个旋转和缩放层(因此强调世界空间值),所有这些都可能轻易地抛弃结果。从简单的案例开始,一次一步地添加变体。也许你可以跳过检查比例,因为你总是在场景中使用统一缩放的对象。