射线平面相交检查标志,EPSLON等

问题描述

我知道这个问题被问得太频繁了,我已经阅读了所有帖子

  1. C++

  2. raytracing

  3. ray bounded plane

距离计算结果正确,但是我遇到的主要问题是符号,对照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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...