Hi, ich bin gerade ein wenig verwirrt, da ich am versuchen bin einen Würfel (Ja bin immer noch bei meinen Würfeln, da ich vorhabe ein Spiel damit zu machen) an der Koordinate der Kamera zu erstellen wenn ich C drücke, um zu sehen ob es auch dort "generiert" wird wo ich will.
Also wenn ich C drücke sieht es so aus:
Aber eigentlich sollte ja nur einer erstellt werden, genau an der Position wo die Kamera ist, und nicht ne ganze Linie davon.
Hier der verantwortliche Code:
Main:
Camera:
Cube:
Und das Problem mit der Kamera:
Sie ist "Kopfüber" also wenn ich SPACE drücke dann get die Koordinate in den Minusbereich und wenn ich SHIFT drücke um runterzugehen, gehe ich hoch?
Hoffe ihr könnt mir helfen.
MfG:
Florilu
Also wenn ich C drücke sieht es so aus:

Aber eigentlich sollte ja nur einer erstellt werden, genau an der Position wo die Kamera ist, und nicht ne ganze Linie davon.
Hier der verantwortliche Code:
Main:
Java:
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.glClear;
import static org.lwjgl.opengl.GL11.glLoadIdentity;
import static org.lwjgl.opengl.GL11.glPopMatrix;
import static org.lwjgl.opengl.GL11.glPushMatrix;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Random;
import javax.imageio.ImageIO;
import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
public class Main
{
private static List<Cube> shapes = new ArrayList<Cube>(1);
public static float xcoords = Camera.x;
public static float ycoords = Camera.y;
public static float zcoords = Camera.z;
public static void main(String[] args){
initDisplay();
gameLoop();
cleanUp();
}
@SuppressWarnings({ "unused" })
public static void gameLoop(){
Camera cam = new Camera(70, (float)Display.getWidth()/(float)Display.getHeight(), 0.3f, 1000);
float x = 0;
while(!Display.isCloseRequested()){
if(Keyboard.isKeyDown(Keyboard.KEY_W)){
cam.move(0.01f, 1);
}if(Keyboard.isKeyDown(Keyboard.KEY_S)){
cam.move(-0.01f, 1);
}if(Keyboard.isKeyDown(Keyboard.KEY_SPACE)){
cam.moveUpDown(-0.01f);
}if(Keyboard.isKeyDown(Keyboard.KEY_UP)){
cam.rotateX(-0.01f);
}if(Keyboard.isKeyDown(Keyboard.KEY_DOWN)){
cam.rotateX(0.01f);
}if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)){
cam.moveUpDown(0.01f);
}if(Keyboard.isKeyDown(Keyboard.KEY_A)){
//cam.rotateY(-0.1f);
cam.rotateY(-0.01f);
}if(Keyboard.isKeyDown(Keyboard.KEY_D)){
//cam.rotateY(0.1f);
cam.rotateY(0.01f);
}if(Keyboard.isKeyDown(Keyboard.KEY_C)){
shapes.add(new Cube(xcoords, ycoords, zcoords));
}if(Keyboard.isKeyDown(Keyboard.KEY_F1)){
screenShot();
}
Display.setTitle("X:"+cam.getX()+" Y:"+cam.getY()+" Z:"+cam.getZ());
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
cam.setView();
Random random = new Random();
glPushMatrix();
{
for(final Cube c : shapes){
c.draw();
}
}
glPopMatrix();
x += 0.01f;
Display.update();
}
}
public static void cleanUp(){
Display.destroy();
}
public static void screenShot(){
Calendar cal = Calendar.getInstance();
SimpleDateFormat formater = new SimpleDateFormat();
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("HH.mm.ss");
String ausgabe = sdf.format(now);
GL11.glReadBuffer(GL11.GL_FRONT);
int width = Display.getDisplayMode().getWidth();
int height = Display.getDisplayMode().getHeight();
int bpp = 4;
ByteBuffer buffer = BufferUtils.createByteBuffer(width * height * bpp);
GL11.glReadPixels(0, 0, width, height, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer);
String format = "png";
File file = new File("images/"+ausgabe+"."+format);
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for(int x = 0; x < width; x++){
for(int y = 0; y < height; y++){
int i = (x + (width * y)) * bpp;
int r = buffer.get(i) & 0xFF;
int g = buffer.get(i + 1) & 0xFF;
int b = buffer.get(i + 2) & 0xFF;
image.setRGB(x, height - (y + 1), (0xFF << 24) | (r << 16) | (g << 8) | b);
}
}
try{
ImageIO.write(image, format, file);
System.out.println("Screenshot erfolgreich erstellt!");
System.out.println(formater.format(cal.getTime()));
}catch(IOException e){
e.printStackTrace();
System.out.println("Fehler beim Erstellen des Bildes!");
}
}
public static void initDisplay(){
try{
Display.setDisplayMode(new DisplayMode(800, 600));
Display.create();
}catch(LWJGLException e){
e.printStackTrace();
Display.destroy();
System.exit(0);
}
}
}
Camera:
Java:
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.*;
public class Camera
{
static float x;
static float y;
static float z;
private float rx;
private float ry;
private float rz;
float speed = 0.01f;
private float fov;
private float aspect;
private float near;
private float far;
public Camera(float fov, float aspect, float near, float far){
x = 0;
y = 0;
z = 0;
rx = 0;
ry = 0;
rz = 0;
this.fov = fov;
this.aspect = aspect;
this.near = near;
this.far = far;
initProjection();
}
private void initProjection(){
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(fov, aspect, near, far);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_DEPTH_TEST);
}
public void setView(){
glRotatef(rx, 1, 0, 0);
glRotatef(ry, 0, 1, 0);
glRotatef(rz, 0, 0, 1);
glTranslatef(x, y, z);
}
public float getX(){
return x;
}
public float getY(){
return y;
}
public float getZ(){
return z;
}
public void setX(float x){
this.x = x;
}
public void setY(float y){
this.y = y;
}
public void setZ(float z){
this.z = z;
}
public float getRX(){
return rx;
}
public float getRY(){
return ry;
}
public float getRZ(){
return rz;
}
public void setRX(float rx){
this.rx = rx;
}
public void setRY(float ry){
this.ry = ry;
}
public void setRZ(float rz){
this.rz = rz;
}
public void move(float amt, float dir){
z += amt * Math.sin(Math.toRadians(ry + 90 * dir));
x += amt * Math.cos(Math.toRadians(ry + 90 * dir));
}
public void moveUpDown(float amt){
y += amt;
}
public void rotateX(float amt){
rx += amt;
}
public void rotateY(float amt){
ry += amt;
}
}
Cube:
Java:
import static org.lwjgl.opengl.GL11.GL_QUADS;
import static org.lwjgl.opengl.GL11.glBegin;
import static org.lwjgl.opengl.GL11.glColor3f;
import static org.lwjgl.opengl.GL11.glEnd;
import static org.lwjgl.opengl.GL11.glTranslatef;
import static org.lwjgl.opengl.GL11.glVertex3f;
public class Cube extends Main
{
static float x;
static float y;
static float z;
public Cube(float x, float y, float z){
this.x = x;
this.y = y;
this.z = z;
draw();
}
static float getX(){
return x;
}
static float getY(){
return y;
}
static float getZ(){
return z;
}
static void draw(){
glColor3f(1.0f, 0.5f, 0f);
glTranslatef(0, 0,-10);
glBegin(GL_QUADS);
{
//Front
glColor3f(1f,0f,0f);
glVertex3f(-1,-1,1);
glVertex3f(1,-1,1);
glVertex3f(1,1,1);
glVertex3f(-1,1,1);
//BackFace
glColor3f(0f,1f,0f);
glVertex3f(-1,-1,-1);
glVertex3f(-1,1,-1);
glVertex3f(1,1,-1);
glVertex3f(1,-1,-1);
//BottomFace
glColor3f(0f,0f,1f);
glVertex3f(-1,-1,-1);
glVertex3f(-1,-1,1);
glVertex3f(-1,1,1);
glVertex3f(-1,1,-1);
//TopFace
glColor3f(1f,1f,0f);
glVertex3f(1,-1,-1);
glVertex3f(1,-1,1);
glVertex3f(1,1,1);
glVertex3f(1,1,-1);
//LeftFace
glColor3f(0f,1f,1f);
glVertex3f(-1,-1,-1);
glVertex3f(1,-1,-1);
glVertex3f(1,-1,1);
glVertex3f(-1,-1,1);
//Right Face
glColor3f(1f,0f,1f);
glVertex3f(-1,1,-1);
glVertex3f(1,1,-1);
glVertex3f(1,1,1);
glVertex3f(-1,1,1);
}
glEnd();
}
}
Und das Problem mit der Kamera:
Sie ist "Kopfüber" also wenn ich SPACE drücke dann get die Koordinate in den Minusbereich und wenn ich SHIFT drücke um runterzugehen, gehe ich hoch?
Hoffe ihr könnt mir helfen.
MfG:
Florilu