我正在使用Windows 7上的Eclipse中的粒子引擎,我遇到了一个我从未见过的问题.我的代码中有这个:
float start = startPosition.getY();
p.position.addTo(p.moveVector);
float end = startPosition.getY();
if(start != end){
System.out.println("hit");
}
Run Code Online (Sandbox Code Playgroud)
它经常打印.我这样做的原因是因为startPosition正在改变,它搞砸了我的程序.
我也进入调试器并查看打印机命中时的值,我得到了这个结果,所有变量都在位置和moveVector:1.0E-5我不知道该怎么做.
这是我的代码.
粒子发射器http://tinyurl.com/9ahwodx
矢量3f http://tinyurl.com/9do6v2k
有问题的代码位于ParticleEmitter的底部.
如果你想看到或知道别的什么让我知道,但我认为这是所有相关的信息.
如何在opengl 2(JOGL)中有效地绘制大量可移动的立方体?我是否必须构建一个包含所有立方体副本并在单个调用中绘制的巨大VBO/VAO?或者为每个通过MVP矩阵的立方体实例调用glDraw以便能够移动特殊立方体?当然立方体共享相同的纹理,顶点,normak等.我需要在绘制10000+时获得最佳性能,但有可能改变粒子立方体的位置
我正在尝试学习现代GLSL,但我甚至无法展示我的立方体......
这就是我创建VBO的方式:
glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW);
glVertexPointer(3, GL_FLOAT, 0, 0L);
glBindBuffer(GL_ARRAY_BUFFER, vboNormalHandle);
glBufferData(GL_ARRAY_BUFFER, normalData, GL_STATIC_DRAW);
glNormalPointer(GL_FLOAT, 0, 0L);
glBindBuffer(GL_ARRAY_BUFFER, vboTextureHandle);
glBufferData(GL_ARRAY_BUFFER, textureData, GL_STATIC_DRAW);
glTexCoordPointer(2, GL_FLOAT, 0, 0L);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)
这就是我渲染vbo的方式:
glLoadIdentity();
glPushAttrib(GL_TRANSFORM_BIT);
glMatrixMode(GL_MODELVIEW);
glTranslatef(0f, 0f, camera.zoom);
glRotatef(camera.rotation.x, 1, 0, 0);
glRotatef(camera.rotation.y, 0, 1, 0);
glRotatef(camera.rotation.z, 0, 0, 1);
glTranslatef(camera.position.x, camera.position.y, camera.position.z);
glPopAttrib();
texture.bind();
glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
glVertexPointer(3, GL_FLOAT, 0, 0L);
glBindBuffer(GL_ARRAY_BUFFER, vboNormalHandle);
glNormalPointer(GL_FLOAT, 0, 0L);
glBindBuffer(GL_ARRAY_BUFFER, vboTextureHandle);
glTexCoordPointer(2, GL_FLOAT, 0, 0L);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glMaterialf(GL_FRONT, GL_SHININESS, 10f);
glDrawArrays(GL_TRIANGLES, 0, triangles.size() …Run Code Online (Sandbox Code Playgroud) 我有一个Pong游戏,我正在努力.现在,我正在努力让玩家划桨.这就是现在发生的事情.比赛开始,球拍位于屏幕上.向上按压桨板使方形向上延伸.按下则相反.我需要的是广场实际上作为单个对象移动并在每次移动时删除它自己以使其在整个时间内保持正方形.而不是桨变得更大,我需要它保持相同的形状,但只是移动.我将如何在openGL中执行此操作?这是我的两个班级.
启动(主要课程):
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import com.evanklein.pong.entitity.Player;
public class Startup {
// set up display
public void start() {
try {
Display.setDisplayMode(new DisplayMode(600, 400)); // these numbers
// pending
Display.setTitle("Evan's Pong!");
Display.create();
} catch (LWJGLException e) {
e.printStackTrace();
System.exit(0);
}
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, 600, 400, 0, 1, -1);
while (!Display.isCloseRequested()) {
// render OpenGL here
GL11.glBegin(GL11.GL_QUADS);
GL11.glColor3f(3.0f, 7.2f, 6.7f);
GL11.glVertex2d(player.width, player.length);
GL11.glVertex2d(player.width + 100, player.length);
GL11.glVertex2d(player.width + 100, player.length + 100);
GL11.glVertex2d(player.width, player.length …Run Code Online (Sandbox Code Playgroud) 我将这些模式用于OPENGL
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 640, 480, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
Run Code Online (Sandbox Code Playgroud)
我正在使用此代码绘制纹理
texture.bind();
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(x, y);// Upper Left
glTexCoord2f(1, 0);
glVertex2f(x + width, y); // Upper right
glTexCoord2f(1, 1);
glVertex2f(x + width, y + heigth); // Lower right
glTexCoord2f(0, 1);
glVertex2f(x, y + heigth); // Lower left
glEnd();
Run Code Online (Sandbox Code Playgroud)
它自己的纹理来自Minecraft,是一个16x16纹理.但当我将它缩放到160x160时,我得到的结果是:

我使用lwjgl渲染游戏环境,同时使用scene2d.UI构建一个包含输入的表.
目前,如果我点击UI它确实会做出反应,但游戏环境也是如此.显然是因为我没有处理它.这里的问题是-where-我应该处理输入,以便鼠标点击UI也不会激活环境的输入处理.
我的想法是将一个监听器附加到UI表并将输入处理移动到监听器.我只是不知道如何设置它.我应该在桌面上设置一个ClickListener,在它的孩子身上,还是我应该在这里做些什么呢?
这是在渲染循环中运行的方法:
private void processInput() {
//Handle user input here
//[...]
//Mouse input
if(Gdx.input.isButtonPressed(Input.Buttons.LEFT) && lastClick == null) {
//lastClick = new Vector2(Gdx.input.getX() + CameraOrigen().x, (CameraOrigen().y+camera.viewportHeight)-Gdx.input.getY());
lastClick = ScreenToWorld(new Vector2(Gdx.input.getX(),Gdx.input.getY()));
gridIntersect = WorldToTileCoord(lastClick);
}
else if (!Gdx.input.isButtonPressed(Input.Buttons.LEFT) && lastClick != null) { lastClick = null; }
}
Run Code Online (Sandbox Code Playgroud)
这就是我目前正在构建UI的方式:
//------------- UI Construction ------------//
table.align(Align.top);
Table debugTable = new Table();
debugTable.add(debugMouseTable);
debugTable.add(debugTileSelectTable);
table.add(debugTable).expandX().height((float)(game.VIRTUAL_HEIGHT * 0.85));
table.add(spTest).width((float)(game.VIRTUAL_WIDTH * 0.2)).height((float)(game.VIRTUAL_HEIGHT * 0.85)).bottom();
table.row();
table.add(sbTileTypes).align(Align.left).expandY();
table.add("corner");
spDebug.pad(10).defaults().expandX().space(4);
for (AtlasRegion aReg : hmTiles.get(TileType.FLOOR)) { …Run Code Online (Sandbox Code Playgroud) 我已经把自己的OBJ解析器/导入器支持添加到我一直在研究的3D渲染引擎上.我遵循了这里发现的几乎'发球' 的规格,目前的例外是限制对组,面,顶点,法线和纹理坐标的所有支持(因此没有材料库或自由形式的多边形支持) .我的目标是简单地逐行解析 - 在我进行时生成面向对象的,分层的树状场景图 - 并允许开发人员自动将数据绑定到着色器程序,只需很少的手动调用,以便开始操纵和查看网格.最终结果是我的引擎成功解析了大多数(如果不是全部)有效的OBJ格式文件,提取了适当的数据并将其发送到基本着色器进行渲染.但是,即使数据似乎在场景图中正确表示,由于某种原因它很少正确渲染...
请注意,一个简单的平面(从3DS Max导出,只包含4个顶点和2个面)渲染完美,但是立方体或任何更高级的平面通常最终看起来像这样:
我不知道出了什么问题,AFAIK我的代码实际上应该解析并渲染基本的几何图形......那么为什么不呢?为方便起见,我在这里上传了我的项目.它包含一个NetBeans项目,其中包含我的引擎的最小版本和一个Test应用程序.我还包括3个不同版本的OBJ立方体网格和一个平面网格.可以通过编辑Test.java顶部的值来配置应用程序,并且唯一的输入控件是用于网格平移的A,S,W和D,以及用于网格旋转的鼠标移动.虽然我已经设法大幅度减少了项目,但最值得注意的类包括文件顶部的额外注释/信息.
考虑到所有事情,我会采取任何我能得到的想法......而且肯定不会不受重视!
因此,我最近刚从LWJGL 2升级到3,并且在获取键盘和鼠标输入时遇到了一些困难。顺便说一下,我正在使用它进行相机的移动和旋转。
我的问题是,如果我使用GLFW回调,则移动似乎非常不稳定且缓慢。这不是一个稳定的速度,只是感觉不对。此外,当我按下一个键(例如w)向前移动时,从GLFW_PRESS到的转换之间大约有半秒的延迟。GLFW_REPEAT这会导致在按下键时相机在前半秒内不会移动。
顺便说一下,我有一个InputHandler类,该类具有用于keyDown,keyPressed,keyReleased等的方法。在一个invoke方法中,我没有所有的键检查。invoke方法将键事件添加到存储键的列表中,以及事件状态枚举,该枚举可以是DOWN,TAPPED,RELEASED,NONE之一。上课很大程度上是基于对这个问题的回答
我花了过去2个小时的时间来寻找解决方案,但没有发现太多。我确实找到了一些使用回调方法的替代方法,例如:
if (glfwGetKey(window, key) == GLFW_PRESS)
Run Code Online (Sandbox Code Playgroud)
和
if (glfwGetKey(windowm key) == GLFW_RELEASE)
Run Code Online (Sandbox Code Playgroud)
但是我找不到一种方法来检测单个按键,即GLFW_REPEAT状态,因为该glfwGetKey方法只能检测GLFW_PRESS和GLFW_RELEASE。
如果有人可以告诉我一种方法来检测单个按键敲击glfwGetKey,或者使GLFW回调更轻松,更流畅,我将不胜感激。
谢谢 :)
我使用的是Mac OS x.我的IDE是Intellij.出于某种原因,我在尝试运行此代码时遇到错误.代码是一个lwjgl游戏引擎.
import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryUtil.*;
import static org.lwjgl.glfw.Callbacks.*;
import org.lwjgl.*;
import java.awt.*;
import java.util.*;
import java.text.DateFormat;
import java.applet.Applet;
public class Main implements Runnable{
private int width = 1280;
private int height =720;
private String title = "Flappy";
private boolean running = false;
private Thread thread;
private long window;
public void start(){
running = true;
thread = new Thread(this, "Display");
//this will call the run method that we created below …Run Code Online (Sandbox Code Playgroud) 我刚刚尝试更新顶点缓冲区对象(vbo),其中包含带静态绘图的数据.为什么我可以用它更新glBufferSubData?我一直认为静态vbo不能改变.