几天前,我开始用Java进行类似Minecraft的游戏。但是当我试图获得玩家正在看的块时我遇到了问题:光线投射总是遇到错误的阻挡。
这是我的代码: 我首先从相机/播放器的偏航/俯仰变量创建方向向量:
Vector3 direction = convert(player.getYaw(), player.getPitch());
Vector3D origin = new Vector3D(player.getX(), player.getY(), player.getZ());
要将偏航/俯仰转换为方向向量,我使用此方法:convert(float yaw,float pitch)
double x = Math.cos(Math.toRadians(pitch)) * Math.cos(Math.toRadians(yaw));
double y = Math.sin(Math.toRadians(pitch));
double z = Math.cos(Math.toRadians(pitch)) * Math.sin(Math.toRadians(yaw));
return new Vector3D(x, y, z).normalize();
这是我的光线投射代码
// The pointer resembles the current position of the raycast
Vector3D pointer = start.clone();
int range = 16;
for(int i = 0; i < range; i++) {
// Add the direction vector to the pointer
pointer.add(direction);
Block block = world.getBlock((int)pointer.getX(), (int)pointer.getY(), (int)pointer.getZ());
if(block != null) {
hitBlock = block;
break;
}
}
以下是显示错误选择的屏幕截图:
我还尝试获取所有近块的列表,然后测试光线是否与立方体的边界框相交。但是这导致选择了一些块,因为光线投射击中了相机甚至看不到的块的面。