Java OpenGL三维碰撞
一切都运行得很完美,但我找不到任何实现碰撞的方法 我已经制作了一个边界框碰撞系统,但是,我还需要一个完美的碰撞系统(基于逐顶点的碰撞) 下面是我尝试使用hitbox网格进行碰撞的过程,它勾勒出了真实网格的轮廓:Java OpenGL三维碰撞,java,opengl,3d,collision,Java,Opengl,3d,Collision,一切都运行得很完美,但我找不到任何实现碰撞的方法 我已经制作了一个边界框碰撞系统,但是,我还需要一个完美的碰撞系统(基于逐顶点的碰撞) 下面是我尝试使用hitbox网格进行碰撞的过程,它勾勒出了真实网格的轮廓: String[] faceName = entity.getHitboxFaces(); //Gets all the faces from the mesh****** Vector3f[] verts = entity.getHitboxVertices(); //Gets all
String[] faceName = entity.getHitboxFaces(); //Gets all the faces from the mesh******
Vector3f[] verts = entity.getHitboxVertices(); //Gets all the vertices******
//Compiles each cube into a list******
for (int i = 0; i < faceName.length;) {
List < Vector3f > tmpVerts = new ArrayList < Vector3f > ();
for (int z = 0; z < 6; z++) {
String[] currentFace = faceName[i].split(",");
tmpVerts.add(verts[Integer.parseInt(currentFace[0]) - 1]);
tmpVerts.add(verts[Integer.parseInt(currentFace[1]) - 1]);
tmpVerts.add(verts[Integer.parseInt(currentFace[2]) - 1]);
tmpVerts.add(verts[Integer.parseInt(currentFace[3]) - 1]);
i++;
}
xmin = 0;
ymin = 0;
zmin = 0;
xmax = 0;
ymax = 0;
zmax = 0;
//Gets the bounding boxes of each cube******
for (Vector3f v: tmpVerts) {
if (v.x < xmin) {
xmin = v.x;
}
if (v.y < ymin) {
ymin = v.y;
}
if (v.z < zmin) {
zmin = v.z;
}
if (v.x > xmax) {
xmax = v.x;
}
if (v.y > ymax) {
ymax = v.y;
}
if (v.z > zmax) {
zmax = v.z;
}
}
//Scales it to the objects scale******
xmin *= scale;
ymin *= scale;
zmin *= scale;
xmax *= scale;
ymax *= scale;
zmax *= scale;
//Checks if the point is in the cube******
if (px >= xmin + (entity.getPosition().x) && px <= xmax + (entity.getPosition().x) && py >= ymin + (entity.getPosition().y) && py <= ymax + (entity.getPosition().y) && pz >= zmin + (entity.getPosition().z) && pz <= zmax + (entity.getPosition().z)) {
hit = true;
}
}
String[]faceName=entity.getHitboxFaces()//获取网格中的所有面******
Vector3f[]顶点=实体。GetHitBoxVertexts()//获取所有顶点******
//将每个多维数据集编译为一个列表******
对于(int i=0;itmpVerts=newarraylist();
对于(intz=0;z<6;z++){
字符串[]currentFace=faceName[i]。拆分(“,”;
tmpVerts.add(verts[Integer.parseInt(currentFace[0])-1]);
tmpVerts.add(verts[Integer.parseInt(currentFace[1])-1]);
tmpVerts.add(verts[Integer.parseInt(currentFace[2])-1]);
tmpVerts.add(verts[Integer.parseInt(currentFace[3])-1]);
i++;
}
xmin=0;
ymin=0;
zmin=0;
xmax=0;
ymax=0;
zmax=0;
//获取每个多维数据集的边界框******
用于(矢量3F v:tmpVerts){
如果(v.xxmax){
xmax=v.x;
}
如果(v.y>ymax){
ymax=v.y;
}
如果(v.z>zmax){
zmax=v.z;
}
}
//将其缩放到对象比例******
xmin*=刻度;
ymin*=刻度;
zmin*=刻度;
xmax*=刻度;
ymax*=刻度;
zmax*=刻度;
//检查点是否在立方体中******
如果(px>=xmin+(entity.getPosition().x)和&px=ymin+(entity.getPosition().y)和&py=zmin+(entity.getPosition().z)和&pz正常情况下,您要做的是创建一个称为碰撞网格的低多边形版本的模型(但您的模型似乎是相当低的多边形,所以它可能会按原样工作)。
然后,一种方法是使用。从你的角色发送一条(或几条)射线,看看它们是否先发出
与另一个对象的边界体积相交。这样可以节省更昂贵的计算
如果是,则可以查看它是否与实际(碰撞)网格相交
如果光线投射还不够,您可以对实际网格或边界体积与网格进行相交检查。这项工作的实施成本更高,也更复杂。不过,这里似乎有大量资源: