C# 团结一致与法线的角度。“的线性变化”;冲孔能力“;

C# 团结一致与法线的角度。“的线性变化”;冲孔能力“;,c#,.net,unity3d,linear-algebra,trigonometry,C#,.net,Unity3d,Linear Algebra,Trigonometry,如何找到子弹击中表面时与法线的夹角?还有一个更大的问题,如何根据这个角度对子弹的“冲力”进行线性变化?也就是说,在45度角时,子弹失去了一半的“冲力”?用标准三角函数相乘毫无意义,因为它们都是非线性的。请帮忙,因为我一点也不懂三角学 我现在能找到的唯一东西是撞击表面的法线。 使用系统集合; 使用System.Collections.Generic; 使用UnityEngine; 公共类子弹:单一行为 { 公共浮点数{get;private set;} 公共刚体公告刚体{get;private

如何找到子弹击中表面时与法线的夹角?还有一个更大的问题,如何根据这个角度对子弹的“冲力”进行线性变化?也就是说,在45度角时,子弹失去了一半的“冲力”?用标准三角函数相乘毫无意义,因为它们都是非线性的。请帮忙,因为我一点也不懂三角学

我现在能找到的唯一东西是撞击表面的法线。

使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类子弹:单一行为
{
公共浮点数{get;private set;}
公共刚体公告刚体{get;private set;}
void Start()
{
脉冲=3f;
BulletRigidbody=GetComponent();
BulletRigidbody.AddForce(transform.up*BulletImpulse,ForceMode.Impulse);
BulletRigidbody.AddTorque(-transform.up*BulletImpulse,ForceMode.Impulse);
}
无效碰撞中心(碰撞)
{
foreach(collision.contacts中的变量项)
{
调试.绘制线(item.point,item.point+item.normal,Color.green,100,false);
打破
}
}}

要获得角度,需要子弹的方向,即撞击时速度的标准化方向,以及撞击点法线的方向。然后可以使用Vector3.angle()获得两者之间的角度,并将其乘以影响因子得到结果

void OnCollisionEnter(Collision collision)
{
   Vector3 bulletDir = collision.getComponent<Rigidbody>().velocity.normalized;
   Vector3 collNormal = collision.contacts[0].normal;
   float angle = Vector3.angle(collNormal, bulletDir);

   float impactFactor = 1 - angle/90f; // impact on a scale from 0-1;
}
void OnCollisionEnter(碰撞)
{
Vector3 bulletDir=collision.getComponent().velocity.normalized;
Vector3 collNormal=碰撞。触点[0]。正常;
浮动角度=矢量3.角度(collNormal,bulletDir);
浮动冲击系数=1-角度/90f;//在0-1范围内的比例上的冲击;
}

(您可能需要使用bulletDir的倒数)

Thx)这是有意义的)哪个部分不工作?您需要提供更多详细信息。由于我项目中的子弹以高速飞行,因此物理计算设置为连续动态模式。Unity以离散模式计算子弹的位置(这很奇怪,因为选择了连续动力学,显然它只适用于计算碰撞)。我必须在FixedUpdate中处理子弹位置,将Fixed Timestep降低到0.0035(以处理高达1000米/秒的速度),如果子弹在同一时间非常多,这是非常昂贵的。也就是说,如果你在OnCollisionCenter中获取子弹的位置或其速度向量,如果子弹高速移动,它将无法正常工作。
void OnCollisionEnter(Collision collision)
{
   Vector3 bulletDir = collision.getComponent<Rigidbody>().velocity.normalized;
   Vector3 collNormal = collision.contacts[0].normal;
   float angle = Vector3.angle(collNormal, bulletDir);

   float impactFactor = 1 - angle/90f; // impact on a scale from 0-1;
}