问题描述
我知道这个问题被问得太频繁了,我已经阅读了所有帖子
距离计算结果正确,但是我遇到的主要问题是符号,对照EPSLON进行检查,是否应该规范射线方向
Point3f.java
public class Point3f
{
public float
x=0,y=0,z=0;
private static float length=0;
public Point3f(float x,float y,float z)
{
this.x=x;
this.y=y;
this.z=z;
}
public static Vector3f sub(Point3f p1,Point3f p2,Vector3f res)
{
if(res==null){res=new Vector3f();}
res.x=p1.x-p2.x;
res.y=p1.y-p2.y;
res.z=p1.z-p2.z;
return res;
}
}
Ray.java
public final class Ray
{
public final Point3f origin=new Point3f();
public final Vector3f direction=new Vector3f();
private Ray(Point3f origin,Vector3f direction)
{
this.origin.set(origin);
this.direction.set(direction); //should I normalize this for calculations?
}
public static Ray of(Point3f origin,Vector3f direction){return new Ray(origin,direction);}
public Point3f cast(float distance)
{
return new Point3f(
origin.x+direction.x*distance,origin.y+direction.y*distance,origin.z+direction.z*distance
);
}
}
Plane.java
public final class Plane
{
public final Point3f point=new Point3f(); //Any Point On The Plane
public final Vector3f normal=new Vector3f(); //Its Normal
public float distance; //Its Distance From Origin
public static final float EPSLON=0.001f; //Is this value small enough? how can we decide?
private Plane(Point3f point,Vector3f normal,float distance)
{
this.point.set(point);
normal.normalise(this.normal);//should i be doing this
this.distance=distance;
}
public static Plane of(Point3f point,float distance){return new Plane(point,normal,distance);}
public Point3f intersect(Ray ray)
{
float denom=Vector3f.dot(normal,ray.direction);
if(Math.abs(denom)<EPSLON){return null;} //If the ray and the plane normal are perpendicular[A.B cos90=0] only then they do not intersect otherwise even if the ray and normal are parallel or at any angle[dont care about the sign as long as they are not perpendicular thats why i used abs()] it is possible that the ray's origin could be on the other side of the plane thus still making intersection possible or atleast that is my logic is it correct?
float dDotv=Vector3f.dot(ray.direction,Point3f.sub(point,ray.origin,new Vector3f()));
float t=(dDotv+distance)/denom; //Is it dDotv+distance OR dDotV-distance OR distance-dDotV?
System.out.print("dDotV="+dDotv+"/"+"Denom="+denom+"/"+"t="+t+"/");
if(t<EPSLON){return null;} // i assume the result should be positive since it is distance or ateast greater than EPSLON but then again i was wrong the t can be -ve or +ve what is the condition here to check if intersection happened?
return ray.cast(t); // return the point of intersection
}
}
这是主程序
public static void main(String[] args)
{
Plane plane=Plane.of(new Vector4f(0,1,0));
System.out.println(plane.intersect(Ray.of(new Point3f(0,10,0),new Vector3f(0,-1,0)))); //Intersection point Should Be (0,0)
System.out.println(plane.intersect(Ray.of(new Point3f(0,-10,new Vector3f(-5,9))));//dont care about the x and z values but y should be zero as plane is at origin
System.out.println(plane.intersect(Ray.of(new Point3f(0,0))));//No Intersection here
System.out.println(plane.intersect(Ray.of(new Point3f(0,0))));//No intersection as point lies on plane or maybe i can return the rays origin as the intersection point if that is the case? suggestions?
System.out.println(plane.intersect(Ray.of(new Point3f(0,0))));//Intersection Should Be (0,0)
System.out.println(plane.intersect(Ray.of(new Point3f(0,new Vector3f(3,0))));//Some Value But still intersection should happen
}
这是结果
dDotV=10.0/Denom=-1.0/t=-10.0/null (Why Is Intersection Null? It should be (0,0))
dDotV=-10.0/Denom=-1.0/t=10.0/(-50.0,-20.0,90.0) (Y coordinate of intersection is not zero inspite of plane being centered at origin so clearly my calculation went wrong somewhere)
dDotV=-10.0/Denom=1.0/t=-10.0/null (Correct)
dDotV=0.0/Denom=1.0/t=0.0/null (Correct)
dDotV=1.0/Denom=1.0/t=1.0/(0.0,0.0,0.0) (Correct)
dDotV=10.0/Denom=1.0/t=10.0/(0.0,0.0) (Correct)
dDotV=1.0/Denom=1.0/t=1.0/(3.0,0.0) (If i were to normalize this ray the result is (0.94868326,-0.6837722,0.0) which is incorrect so when do i normalize the ray?)
如您所见,第一个交集应为(0,0)为null,那么这里的错误是什么?我已经尝试了链接文章中建议的每个版本,但没有人详细讨论该标志,主要问题是我
->如何在我的相交函数中检查符号[何时何地使用绝对值进行比较?”
-> EPSLON最好的价值是什么?
->我应该将射线方向,平面法线归一化还是对两者进行归一化?或者不对它们进行归一化?
这些只是我运行的几个测试用例,但是当使用它进行光线跟踪时,可能会在某些时候产生不确定的结果。我正在寻找每个点的优化和错误修复,因为我将在射线跟踪器中广泛使用此代码[射线三角形与平面的相交处,然后检查点是否在三重中]我希望射线在前面相交并飞机的背面
我正在将LWJGL 2.9.3实用程序用于矢量
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)