在碰撞 Unity3d C# 上创建贴花
Creating decal on collision Unity3d C#
下面的代码来自我正在创建的一个快速游戏,用于测试 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);
}
这会很棘手...
但有可能。
第一步:获取发生碰撞的网格的三角形。根据 this answer 我们可以通过 Raycast 做到这一点。这很简单。
第二步:获取这个三角形的表面法线。
Mesh mesh = meshCollider.sharedMesh;
Vector3[] normals = mesh.normals;
好的,很好。我们可以获得该数据。大概我们想要的这个数组的索引与步骤 1 中的 RaycastHit.triangleIndex
值相同。使用简单的网格(立方体、平面)进行一些测试以确保。
第三步:旋转。为了匹配预制件上的“向上”方向,你必须稍微玩一下这个。将 Z+ 设为 splat 的可见面只是为了让数学更简单,如果它是 Y+,那将是一个容易犯的错误。
第 4 步:考虑整个对象的 worldspace 旋转。一旦针对面部旋转了 splat 预制件(未旋转对象上的测试步骤 3),添加应用于对象的旋转。
请注意,本身是其他对象子对象的对象可能应用了多个旋转和缩放层(因此强调世界空间值),所有这些都可能很容易导致结果丢失。从简单的案例开始,一步一步地添加变化。也许您可以跳过检查比例,因为您将始终在场景中使用统一缩放的对象。
下面的代码来自我正在创建的一个快速游戏,用于测试 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);
}
这会很棘手...
但有可能。
第一步:获取发生碰撞的网格的三角形。根据 this answer 我们可以通过 Raycast 做到这一点。这很简单。
第二步:获取这个三角形的表面法线。
Mesh mesh = meshCollider.sharedMesh;
Vector3[] normals = mesh.normals;
好的,很好。我们可以获得该数据。大概我们想要的这个数组的索引与步骤 1 中的 RaycastHit.triangleIndex
值相同。使用简单的网格(立方体、平面)进行一些测试以确保。
第三步:旋转。为了匹配预制件上的“向上”方向,你必须稍微玩一下这个。将 Z+ 设为 splat 的可见面只是为了让数学更简单,如果它是 Y+,那将是一个容易犯的错误。
第 4 步:考虑整个对象的 worldspace 旋转。一旦针对面部旋转了 splat 预制件(未旋转对象上的测试步骤 3),添加应用于对象的旋转。
请注意,本身是其他对象子对象的对象可能应用了多个旋转和缩放层(因此强调世界空间值),所有这些都可能很容易导致结果丢失。从简单的案例开始,一步一步地添加变化。也许您可以跳过检查比例,因为您将始终在场景中使用统一缩放的对象。