Я делаю 3D-игру Java с библиотекой LWJGL, и мне было интересно, как добавить обнаружение столкновений, чтобы игрок не просматривал модели.Java 3D LWJGL collision
Я использую модели OBJ. Вот класс OBJLoader, который загружает модели:
package renderEngine;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import models.RawModel;
import org.lwjgl.util.vector.Vector2f;
import org.lwjgl.util.vector.Vector3f;
public class OBJLoader {
public static RawModel loadObjModel(String fileName, Loader loader){
FileReader fr = null;
try {
fr = new FileReader(new File("res/"+fileName+".obj"));
} catch (FileNotFoundException e) {
System.err.println("Couldn't load file!");
e.printStackTrace();
}
BufferedReader reader = new BufferedReader(fr);
String line;
List<Vector3f> vertices = new ArrayList<Vector3f>();
List<Vector2f> textures = new ArrayList<Vector2f>();
List<Vector3f> normals = new ArrayList<Vector3f>();
List<Integer> indices = new ArrayList<Integer>();
float[] verticesArray = null;
float[] normalsArray = null;
float[] textureArray = null;
int[] indicesArray = null;
try{
while(true){
line = reader.readLine();
String[] currentLine = line.split(" ");
if(line.startsWith("v ")){
Vector3f vertex = new Vector3f(Float.parseFloat(currentLine[1]),
Float.parseFloat(currentLine[2]), Float.parseFloat(currentLine[3]));
vertices.add(vertex);
}else if(line.startsWith("vt ")){
Vector2f texture = new Vector2f(Float.parseFloat(currentLine[1]),
Float.parseFloat(currentLine[2]));
textures.add(texture);
}else if(line.startsWith("vn ")){
Vector3f normal = new Vector3f(Float.parseFloat(currentLine[1]),
Float.parseFloat(currentLine[2]), Float.parseFloat(currentLine[3]));
normals.add(normal);
}else if(line.startsWith("f ")){
textureArray = new float[vertices.size() * 2];
normalsArray = new float[vertices.size() * 3];
break;
}
}
while(line != null){
if(!line.startsWith("f ")){
line = reader.readLine();
continue;
}
String[] currentLine = line.split(" ");
String[] vertex1 = currentLine[1].split("/");
String[] vertex2 = currentLine[2].split("/");
String[] vertex3 = currentLine[3].split("/");
processVertex(vertex1, indices, textures, normals, textureArray, normalsArray);
processVertex(vertex2, indices, textures, normals, textureArray, normalsArray);
processVertex(vertex3, indices, textures, normals, textureArray, normalsArray);
line = reader.readLine();
}
reader.close();
}catch(Exception e){
e.printStackTrace();
}
verticesArray = new float[vertices.size()*3];
indicesArray = new int[indices.size()];
int vertexPointer = 0;
for(Vector3f vertex:vertices){
verticesArray[vertexPointer++] = vertex.x;
verticesArray[vertexPointer++] = vertex.y;
verticesArray[vertexPointer++] = vertex.z;
}
for(int i=0;i<indices.size(); i++){
indicesArray[i] = indices.get(i);
}
return loader.loadToVAO(verticesArray, textureArray, normalsArray, indicesArray);
}
private static void processVertex(String[] vertexData, List<Integer> indices,
List<Vector2f> textures,
List<Vector3f> normals, float[] textureArray, float[] normalsArray){
int currentVertexPointer = Integer.parseInt(vertexData[0]) - 1;
indices.add(currentVertexPointer);
Vector2f currentTex = textures.get(Integer.parseInt(vertexData[1]) - 1);
textureArray[currentVertexPointer*2] = currentTex.x;
textureArray[currentVertexPointer*2+1] = 1 - currentTex.y;
Vector3f currentNorm = normals.get(Integer.parseInt(vertexData[2])-1);
normalsArray[currentVertexPointer*3] = currentNorm.x;
normalsArray[currentVertexPointer*3+1] = currentNorm.y;
normalsArray[currentVertexPointer*3+2] = currentNorm.z;
}
}
Спасибо!
Большое спасибо! Я делал вещи, связанные с ограничивающей коробкой, и для игры, которую я делаю, это может сработать. Это довольно просто, и я не собираюсь добавлять очень сложные модели. –
Другой способ сделать это может состоять в том, чтобы получить положение каждой вершины и использовать их как мини-ограничивающие прямоугольники. Не знаю, может ли это вызвать отставание, но это было бы не очень идеально, особенно для больших плоских моделей. –