我试图制作一个圆圈(带有动态位置)和另一个不应该通过第一个圆圈的圆圈 - 如下图所示
我这样做的原因是因为大的那个对象可能会有很多其他对象。
但问题是Physics.Raycast并不总能检测到我的球体:
蓝线是光线投射
基本上我所做的是通过整个大圆圈进行光线投射,并找出较小的圆圈。
这是我检测大圆上物体的代码:
void GetCollisions () {
Angle FixedRenderAngle, k;
RaycastHit hit;
Vector3 p1, p2;
float d, d1, radius;
for ( int i = 0; i < Radiuses.Count; i++ ) {
if ( Angles[i] == null )
Angles[i] = new List<Angle>();
radius = Radiuses[i];
FixedRenderAngle = 360f / (float)NumberOfCalls;
AnglesLast[i] = 0;
Angle j = 0f, pj;
bool exception = false;
for ( int l = 0; l < NumberOfCalls; l++) {
j+= FixedRenderAngle;
pj = j - FixedRenderAngle;
p1 = pj.PointByRadius ( radius );
p2 = j.PointByRadius ( radius );
Debug.DrawRay ( p1, p2 - p1, Color.cyan, 3f );
if ( Physics.Raycast ( p1, p2 - p1, out hit, Vector3.Distance ( p1, p2 ) ) ) {
d = Vector3.Distance ( p1, p2 );
d1 = Vector3.Distance ( p1,hit.point );
k = pj + (j -pj) * (d1/d);
AddToAngles ( ref k, i );
}
if ( Physics.Raycast ( p2, p1 - p2, out hit, Vector3.Distance ( p1, p2 ) ) ) {
if ( AnglesLast[i] == 0 ) exception = true;
d = Vector3.Distance ( p1, p2 );
d1 = Vector3.Distance ( p1,hit.point );
k = pj + (j -pj) * (d1/d);
AddToAngles ( ref k, i );
}
}
if ( exception == true ) {
Angle tmp = Angles[i][AnglesLast[i] - 1];
for ( int l = AnglesLast[i] - 1; l > 0 ; l-- )
Angles[i][l] = Angles[i][l-1];
Angles[i][0] = tmp;
}
}
}
Angle是一个浮点数表示度数(0到360)的类,它的函数PointByRadius返回一个Vector3,表示基于角度和给定半径应该在圆上的位置。< / p>
我做错了什么或者有些事我不了解光线投射?任何帮助,将不胜感激。 (当然,任何其他方法都有帮助)
答案 0 :(得分:0)
Physics.SphereCast?它有点像OverlapSphere,但可能更多你需要的东西? (虽然很难确切地说出你想要做什么......例如,当你说圈子时,你的意思是实际的圆圈只在XY上移动或者它们在Z中移动吗?你在尝试哪个圆圈隐藏大小的东西?你试图在视觉上隐藏一个较大的圆圈吗?)
根据物体移动和尺寸的速度,光线投射(和一般的PhysX碰撞器)可能会变得不稳定,至少在我的经验中。您也可以尝试弄乱您的物理时间步长,看看问题的部分原因,比如更频繁地进行,看看您是否仍然遇到问题行为。不确定,只是抛出想法。