- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我最近开始使用 LWJGL 进行编程,而且我有将近 2 年的 Java 经验。我很难让相机正确移动(相机处于第一人称视角)。我希望能够使用箭头键四处移动并根据鼠标位置旋转相机。有人知道像这样的相机类(class)的好教程吗?我找不到任何接近我需要的东西。也许还有一些教一些 3D 概念的书?
最佳答案
这是我做的,应该是不言自明的
public class Camera {
public static float moveSpeed = 0.5f;
private static float maxLook = 85;
private static float mouseSensitivity = 0.05f;
private static Vector3f pos;
private static Vector3f rotation;
public static void create() {
pos = new Vector3f(0, 0, 0);
rotation = new Vector3f(0, 0, 0);
}
public static void apply() {
if(rotation.y / 360 > 1) {
rotation.y -= 360;
} else if(rotation.y / 360 < -1) {
rotation.y += 360;
}
glLoadIdentity();
glRotatef(rotation.x, 1, 0, 0);
glRotatef(rotation.y, 0, 1, 0);
glRotatef(rotation.z, 0, 0, 1);
glTranslatef(-pos.x, -pos.y, -pos.z);
}
public static void acceptInput(float delta) {
acceptInputRotate(delta);
acceptInputGrab();
acceptInputMove(delta);
}
public static void acceptInputRotate(float delta) {
if(Mouse.isGrabbed()) {
float mouseDX = Mouse.getDX();
float mouseDY = -Mouse.getDY();
rotation.y += mouseDX * mouseSensitivity * delta;
rotation.x += mouseDY * mouseSensitivity * delta;
rotation.x = Math.max(-maxLook, Math.min(maxLook, rotation.x));
}
}
public static void acceptInputGrab() {
if(Mouse.isInsideWindow() && Mouse.isButtonDown(0)) {
Mouse.setGrabbed(true);
}
if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
Mouse.setGrabbed(false);
}
}
public static void acceptInputMove(float delta) {
boolean keyUp = Keyboard.isKeyDown(Keyboard.KEY_W);
boolean keyDown = Keyboard.isKeyDown(Keyboard.KEY_S);
boolean keyRight = Keyboard.isKeyDown(Keyboard.KEY_D);
boolean keyLeft = Keyboard.isKeyDown(Keyboard.KEY_A);
boolean keyFast = Keyboard.isKeyDown(Keyboard.KEY_Q);
boolean keySlow = Keyboard.isKeyDown(Keyboard.KEY_E);
boolean keyFlyUp = Keyboard.isKeyDown(Keyboard.KEY_SPACE);
boolean keyFlyDown = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT);
float speed;
if(keyFast) {
speed = moveSpeed * 5;
}
else if(keySlow) {
speed = moveSpeed / 2;
}
else {
speed = moveSpeed;
}
speed *= delta;
if(keyFlyUp) {
pos.y += speed;
}
if(keyFlyDown) {
pos.y -= speed;
}
if(keyDown) {
pos.x -= Math.sin(Math.toRadians(rotation.y)) * speed;
pos.z += Math.cos(Math.toRadians(rotation.y)) * speed;
}
if(keyUp) {
pos.x += Math.sin(Math.toRadians(rotation.y)) * speed;
pos.z -= Math.cos(Math.toRadians(rotation.y)) * speed;
}
if(keyLeft) {
pos.x += Math.sin(Math.toRadians(rotation.y - 90)) * speed;
pos.z -= Math.cos(Math.toRadians(rotation.y - 90)) * speed;
}
if(keyRight) {
pos.x += Math.sin(Math.toRadians(rotation.y + 90)) * speed;
pos.z -= Math.cos(Math.toRadians(rotation.y + 90)) * speed;
}
}
public static void setSpeed(float speed) {
moveSpeed = speed;
}
public static void setPos(Vector3f pos) {
Camera.pos = pos;
}
public static Vector3f getPos() {
return pos;
}
public static void setX(float x) {
pos.x = x;
}
public static float getX() {
return pos.x;
}
public static void addToX(float x) {
pos.x += x;
}
public static void setY(float y) {
pos.y = y;
}
public static float getY() {
return pos.y;
}
public static void addToY(float y) {
pos.y += y;
}
public static void setZ(float z) {
pos.z = z;
}
public static float getZ() {
return pos.z;
}
public static void addToZ(float z) {
pos.z += z;
}
public static void setRotation(Vector3f rotation) {
Camera.rotation = rotation;
}
public static Vector3f getRotation() {
return rotation;
}
public static void setRotationX(float x) {
rotation.x = x;
}
public static float getRotationX() {
return rotation.x;
}
public static void addToRotationX(float x) {
rotation.x += x;
}
public static void setRotationY(float y) {
rotation.y = y;
}
public static float getRotationY() {
return rotation.y;
}
public static void addToRotationY(float y) {
rotation.y += y;
}
public static void setRotationZ(float z) {
rotation.z = z;
}
public static float getRotationZ() {
return rotation.z;
}
public static void addToRotationZ(float z) {
rotation.z += z;
}
public static void setMaxLook(float maxLook) {
Camera.maxLook = maxLook;
}
public static float getMaxLook() {
return maxLook;
}
public static void setMouseSensitivity(float mouseSensitivity) {
Camera.mouseSensitivity = mouseSensitivity;
}
public static float getMouseSensitivity() {
return mouseSensitivity;
}
}
关于java - 使用 LWJGL 创建相机类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23727493/
如何以编程方式创建最大化的 lwjgl 窗口或使已创建的显示最大化? 注意:我不是问如何为显示器设置全屏模式。 最佳答案 Display.setResizable(true) 这将启用最大化按钮。 关
我对使用外部 Java 库非常陌生,我从基于 LWJGL 构建的 Slick2D 开始。我编写了一个简单的 StateBasedGame,它只在屏幕上打印三个选项。它给了我一个关于某些(jar?)文件
Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.libr ary.path at
我正在 Itellij 中制作一个依赖 org.lwjgl.input 代码的 Minecraft mod。该库已从 LWJGL 3 中删除,因此我必须使用 LWJGL 2。我将正确的 LWJGL 2
我安装了 lwjgl 库和 natives 并将其放入/lib 文件夹。在 Eclipse Java 构建路径上设置库位置和 native 库位置。当我尝试在 Eclipse 上运行它时,它可以工作,
所以我已经使用 LWJGL 开发一个程序很长一段时间了,现在我希望能够轻松地向其他人展示它。但是,当我尝试将其导出为可运行的 jar 文件并在控制台中运行时,出现上述错误。 我还尝试将其导出为普通的
我尝试使用 LWJGL 编译 ( NetBeans ) Java 项目。我单击了项目 -> 属性,然后单击库 -> 编译。我添加了 Jars 位置、源文件位置和 javadoc 位置。 当我尝试构建项
在 NEHE 第 06 课 (http://nehe.gamedev.net/tutorial/texture_mapping/12038/) 中,您可以加载图像并用它来纹理对象。我目前使用的是LWJ
我正在尝试向我的程序添加全屏功能,但我无法让它工作。我想 Display.setFullscreen(true); 我尝试将其位置更改为创建显示的位置或设置显示模式的位置上方,但仍然无法正常工作。有什
我刚刚开始使用 LWJGL 和 OpenGL,但遇到了问题。我正在尝试弄清楚如何使用我找到的游戏引擎为我正在制作的游戏绘制一条简单的线条。 这是我正在使用的引擎的链接:https://github.c
我正在尝试在 java lwjgl 2.9 中编译着色器,如果我运行我的游戏,它无法编译着色器。问题是为什么着色器不重新识别 const 关键字,如果我删除 const 那么它会抛出错误 float
我在使用 Java 和 lwjgl 导入时遇到问题: import org.lwjgl.input.Keyboard; 行不通。我已经添加了 jar : lwjgl-glfw.jar lwjgl-op
我在 OpenGL 上下文中移动实体时遇到问题:当我尝试放置一个实体时,位置似乎是正确的,但是当实体开始移动时,一切都会出错,并且碰撞不起作用。我是 OpenGL 新手,我怀疑我的世界矩阵或模型矩阵是
我正在做一项家庭作业,使用 LightWeight Java 游戏库修改教授给出的代码。问题是我无法完全加载测试代码来开始测试修改。我已经按照修改中的说明链接了 jar 文件,但仍然存在一个挥之不去的
我是 Java 新手,我想将基本的 LWJGL 小程序上传到我的网站并在浏览器中播放。我不知道该怎么做,我想确保在继续开发游戏之前我知道如何让它工作。请帮助我,因为我不知道如何将 JWJGL 小程序或
我正在尝试旋转屏幕上的两个对象之一。我该怎么做?我只能让它旋转屏幕上的所有对象。代码: glColor3f(1, 0, 0); glBegin(GL_QUADS
我目前正在渲染一个天空盒,如下所示: //Front Face GL11.glBindTexture(GL11.GL_TEXTURE_2D, skybox[0].getText
我正在编写类似 Minecraft 的游戏。为了加载纹理和字体(目前没有声音),我使用 slick。 Slick 不再开发,maven 存储库不可用。是否有其他库(LibGDX 除外)可用于加载 lw
我正在尝试使用opengl在lwjgl显示屏上显示具有自定义字体的文本。目前,我正在使用自定义位图字体类从png文件加载字体,并以与tileet相同的方式显示它们。它可以正常工作,但是当我将文本绘制到
我正在使用 VBO 来渲染游戏中的所有立方体(因为会有很多立方体),并且我希望它们都带有纹理。当我运行我的代码时,立方体没有纹理(相反,它看起来有点红色,因为我的纹理是砖墙),并且只有当我非常接近立方
我是一名优秀的程序员,十分优秀!