- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个 LWJGL 程序来测试一个立方体是否在相机前面。我认为它有效,但我得到了很多不同的数字。我在想这是因为平面会永远持续下去,而且它们不是有限的正方形。我该怎么做才能解决这个问题? (我还注意到我的代码相当慢,这可能是什么原因造成的???)
这是我的路口代码:
public static float getCubeInteresection(Cube b, Vector3f camera, Vector3f lookat)
{
Vector3f l = b.Location;
float boxs = 0.5f;
Plane3f[] bplanes = Plane3f.getBoxDefaults(l, boxs);
Vector3f result = null;
for (int t = 0; t < bplanes.length; t++)
{
Vector3f raytrace = getIntersection(camera, lookat,bplanes[t].Point0,bplanes[t].Point1,bplanes[t].Point2);
if (raytrace != null)
{
result = raytrace;
break;
}
}
if (result == null)
return -1.0f; //not hit, waste of time... lol
float x = (float) Math.pow(result.x - camera.x, 2);
float y = (float) Math.pow(result.y - camera.y, 2);
float z = (float) Math.pow(result.z - camera.z, 2);
float dist = (float) Math.sqrt(x + y + z);
return dist;
}
private static Vector3f getIntersection(Vector3f line12, Vector3f line22,Vector3f plane12, Vector3f plane22, Vector3f plane32)
{
javax.vecmath.Vector3f plane1 = new javax.vecmath.Vector3f(plane12.x,plane12.y,plane12.z);
javax.vecmath.Vector3f plane2 = new javax.vecmath.Vector3f(plane22.x,plane22.y,plane22.z);
javax.vecmath.Vector3f plane3 = new javax.vecmath.Vector3f(plane32.x,plane32.y,plane32.z);
javax.vecmath.Vector3f line1 = new javax.vecmath.Vector3f(line12.x,line12.y,line12.z);
javax.vecmath.Vector3f line2 = new javax.vecmath.Vector3f(line22.x,line22.y,line22.z);
javax.vecmath.Vector3f p1 = new javax.vecmath.Vector3f(plane1);
javax.vecmath.Vector3f p2 = new javax.vecmath.Vector3f(plane2);
javax.vecmath.Vector3f p3 = new javax.vecmath.Vector3f(plane3);
javax.vecmath.Vector3f p2minusp1 = new javax.vecmath.Vector3f(p2);
p2minusp1.sub(p1);
javax.vecmath.Vector3f p3minusp1 = new javax.vecmath.Vector3f(p3);
p3minusp1.sub(p1);
javax.vecmath.Vector3f normal = new javax.vecmath.Vector3f();
normal.cross(p2minusp1, p3minusp1);
double d = -p1.dot(normal);
javax.vecmath.Vector3f i1 = new javax.vecmath.Vector3f(line1);
javax.vecmath.Vector3f direction = new javax.vecmath.Vector3f(line1);
direction.sub(line2);
double dot = direction.dot(normal);
if (dot == 0) return null;
double t = (-d - i1.dot(normal)) / (dot);
javax.vecmath.Vector3f intersection = new javax.vecmath.Vector3f(line1);
javax.vecmath.Vector3f scaledDirection = new javax.vecmath.Vector3f(direction);
float scalent = (float)t;
scaledDirection.scale(scalent);
intersection.add(scaledDirection);
javax.vecmath.Vector3f intersectionPoint = new javax.vecmath.Vector3f(intersection);
return new Vector3f(intersectionPoint.x,intersectionPoint.y,intersectionPoint.z);
}
这是我的 Cube 代码:
import org.lwjgl.util.vector.Vector3f;
public class Plane3f
{
public Vector3f Point0;
public Vector3f Point1;
public Vector3f Point2;
public Plane3f(Vector3f p0, Vector3f p1, Vector3f p2)
{
Point0 = p0;
Point1 = p1;
Point2 = p2;
}
public static Plane3f[] getBoxDefaults(Vector3f l, float boxs)
{
Plane3f[] plane = new Plane3f[24];
Vector3f p0p0 = new Vector3f(-boxs + l.x, -boxs + l.y, boxs + l.z);
Vector3f p0p1 = new Vector3f(boxs + l.x, -boxs + l.y, boxs + l.z);
Vector3f p0p2 = new Vector3f(boxs + l.x, boxs + l.y, boxs + l.z);
//Vector3f p0p3 = new Vector3f(-boxs + l.x, boxs + l.y, boxs + l.z);
Plane3f p0 = new Plane3f(p0p0, p0p1, p0p2);
Vector3f p1p0 = new Vector3f(-boxs + l.x, -boxs + l.y, -boxs + l.z);
Vector3f p1p1 = new Vector3f(-boxs + l.x, boxs + l.y, -boxs + l.z);
Vector3f p1p2 = new Vector3f(boxs + l.x, boxs + l.y, -boxs + l.z);
//Vector3f p1p3 = new Vector3f(boxs + l.x, -boxs + l.y, -boxs + l.z);
Plane3f p1 = new Plane3f(p1p0, p1p1, p1p2);
Vector3f p2p0 = new Vector3f(-boxs + l.x, boxs + l.y, -boxs + l.z);
Vector3f p2p1 = new Vector3f(-boxs + l.x, boxs + l.y, boxs + l.z);
Vector3f p2p2 = new Vector3f(boxs + l.x, boxs + l.y, boxs + l.z);
//Vector3f p2p3 = new Vector3f(boxs + l.x, boxs + l.y, -boxs + l.z);
Plane3f p2 = new Plane3f(p2p0, p2p1, p2p2);
Vector3f p3p0 = new Vector3f(-boxs + l.x, -boxs + l.y, -boxs + l.z);
Vector3f p3p1 = new Vector3f(boxs + l.x, -boxs + l.y, -boxs + l.z);
Vector3f p3p2 = new Vector3f(boxs + l.x, -boxs + l.y, boxs + l.z);
Plane3f p3 = new Plane3f(p3p0, p3p1, p3p2);
Vector3f p4p0 = new Vector3f(boxs + l.x, -boxs + l.y, -boxs + l.z);
Vector3f p4p1 = new Vector3f(boxs + l.x, boxs + l.y, -boxs + l.z);
Vector3f p4p2 = new Vector3f(boxs + l.x, boxs + l.y, boxs + l.z);
Plane3f p4 = new Plane3f(p4p0, p4p1, p4p2);
Vector3f p5p0 = new Vector3f(-boxs + l.x, -boxs + l.y, -boxs + l.z);
Vector3f p5p1 = new Vector3f(-boxs + l.x, -boxs + l.y, boxs + l.z);
Vector3f p5p2 = new Vector3f(-boxs + l.x, boxs + l.y, boxs + l.z);
Plane3f p5 = new Plane3f(p5p0, p5p1, p5p2);
plane[0] = p0;
plane[1] = p1;
plane[2] = p2;
plane[3] = p3;
plane[4] = p4;
plane[5] = p5;
return plane;
}
控制台的输出:
相机:(0.0,0.0,6.0)LookAt(行尾):(124.33239,274.9127,-1000.5496) 距离(从“getBlockInteresection”返回):2.6099026 立方体位置:6,7,8
最佳答案
我不得不在我的游戏中处理这个问题,但是光线转换和视锥体剔除是两种不同的东西。视锥体剔除在大量对象上执行的成本通常更高,而且准确性也较低,但它更简单,可能适合您的程序。
如果您只需要知道立方体是否在视口(viewport)中,您可以使用链接中的函数。这将测试立方体是否在您的视锥体内,而不仅仅是在它的前面,所以如果它在前面但离侧面太远,它将返回 false。
否则,您将需要使用新的 glortho 和 gldeproject 编写光线转换算法。
http://www.crownandcutlass.com/features/technicaldetails/frustum.html
关于java - 这个光线转换算法正确吗?这是测试线/射线和立方体相交的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7909855/
过去几天我一直在研究这个问题,但一直被困住。我需要能够触摸屏幕并返回模型上最接近与拾取点生成的射线相交的近平面的点的 x,y,z 坐标。我认为我的问题的一部分是我在模型的整个渲染代码中进行了一系列矩阵
我有一个由两点 A 和 B 以及半径 r 定义的胶囊。射线由等式定义:X = O + D*t。现在我需要获取所有 (0-2) 个交点的 t。 一种可能的解决方案是计算在 A 和 B 处与球体的交点以及
我看到了Fast Minimum Storage Ray/Triangle Intersection经常推荐 Moller 和 Trumbore 的作品。 问题是,我不介意预先计算和存储任何数量的数据
我知道如何计算光线平面交点,但如何测试交点是否在该平面上的正方形内?我正在测试该点是否在距正方形中心一定距离内,但我不确定这是否正确。 最佳答案 这是一种适用于任何凸多边形的方法:(请参阅答案末尾的方
我知道如何计算光线平面交点,但如何测试交点是否在该平面上的正方形内?我正在测试该点是否在距正方形中心一定距离内,但我不确定这是否正确。 最佳答案 这是一种适用于任何凸多边形的方法:(请参阅答案末尾的方
我想实现 Moller & Trumbore 算法,解释为 http://geomalgorithms.com/a06-_intersect-2.html 进入我的 openframeworks 项目
我正在测试射线是否与三角形相交。目前,我正在使用以下代码来测试三角形与从原点到三角形中点的射线之间是否存在交点: Ray *ray = new Ray(Vec3(0), chosenTriangle-
我们可以在 matplotlib 中使用 plt.axline() ( https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.axli
我的光线拾取代码有问题。我的代码 我正在使用此代码进行选择计算: /*----------------------------------------------------------- Funct
使用 ray 框架时,有一个选项可以选择此任务所需的 CPU 数量,如解释的那样 here . 例如: @ray.remote(num_cpus=4) def f(): return 1 然而
我正在尝试对 Meteor 使用 X 射线,但到目前为止还没有成功。 这是我正在测试的示例(它在基本 Node 应用程序上运行良好) import Xray from 'x-ray'; var xra
我正在我的游戏中编写 C++ 碰撞检测程序,并试图提出一种算法:我有一个由两个中心点(C1、C2)、长度和半径定义的胶囊。然后我有一条用两点(R1,R2)定义的射线。我已经知道它们相交了。我只需要找到
我目前正在研究 Path Tracer,我正在寻找优化光线-三角形相交的方法。我目前使用 Moller-Trumbore 算法的以下 sse4 实现: bool Ray::intersectTrian
我有一个基于 PPO 策略的模型,我使用 RLLib 在一些标准健身房环境中使用 Ray Tune API 进行训练(没有花哨的预处理)。我保存了模型检查点,我可以从中加载和恢复以进行进一步训练。 现
我目前在我的 lambda 中使用 postgresql-node import { Client } from 'pg' 我想使用 AWS X-ray 检测 Postgresql 库。 Nodejs
我正在尝试使用 X 射线来跟踪使用 SNS-SQS fanout pattern 的请求. 请求来自 API GW、lambda 代理集成、发布到 SNS 并传送到订阅的 SQS,该 SQS 具有接收
我需要使用以下输入/输出编写一个 python 函数或类 输入: X 射线源的位置(仍然不确定为什么需要它) 董事会的职位(仍然不确定为什么需要) 三维 CT 扫描 输出: 二维 X 射线扫描(模拟
我有一个 Flask 应用程序作为与 Zappa 一起部署的 AWS Lambda 函数运行,我想激活 X-Ray 以获取有关不同函数的更多信息。 使用 Zappa 激活 X-Ray 非常简单 - 只
我已将 X 射线检测添加到我的 lambda(Node.js) 中,并且可以在跟踪中看到它周围的所有服务,但仍然无法将调用它的 API 网关添加到跟踪和服务映射中。有什么办法吗? 最佳答案 几天前AW
我正在构建一个简单的 3D 模型来绘制 3D 长方体。在这个模型中,没有特殊的循环情况,例如 A 在 B 之前,C 在 A 之前,或者 A 的一部分在 B 之前,但 B 的一部分在 A 之前。 现在给
我是一名优秀的程序员,十分优秀!