LWJGL камера от первого лица с использованием jBullet
У меня настроена камера, и я могу двигаться с помощью WASD и поворачивать вид с помощью мыши. Но теперь возникает проблема: я хочу добавить физику в камеру / плеер, чтобы она "взаимодействовала" с моими другими объектами jBullet. Как я могу это сделать? Я думал о создании RigidBody для камеры и сохранении там позиции, чтобы jBullet мог применить свою физику к камере. Затем, когда мне нужно что-то изменить (позицию), я мог бы просто изменить это в RigidBody. Но я не нашел никаких методов для редактирования позиции.
Можете ли вы подтолкнуть меня в правильном направлении или, может быть, привести пример исходного кода?
2 ответа
Я задавал тот же вопрос сам несколько дней назад. Мое решение было, как сказал Sierox. Чтобы создать RigidBody of BoxShape и добавить его в DynaicsWorld. Чтобы переместить камеру назад, приложите силу к ее жесткому телу. У меня установлено демпфирование на 0,999 для линейного и 1 для углового, чтобы остановить камеру, когда сила не приложена, то есть игрок перестает нажимать кнопку.
Я также использую body.setAngularFactor(0); поэтому коробка не повсюду повсюду. Также установите очень низкую массу, чтобы не слишком мешать другим объектам, но при этом иметь возможность прыгать и сталкиваться с ними, а также подвергаться их влиянию.
Не забудьте преобразовать координаты x,y и z в декартову плоскость, чтобы вы двигались в направлении камеры. т.е.
protected void setCartesian(){//set xyz to a standard plane
yrotrad = (float) (yrot / 180 * Math.PI);
xrotrad = (float) (xrot / 180 * Math.PI);
float pd = (float) (Math.PI/180);
x = (float) (-Math.cos(xrot*pd)*Math.sin(yrot*pd));
z = (float) (-Math.cos(xrot*pd)*Math.cos(yrot*pd));
//y = (float) Math.sin(xrot*pd);
}//..
public void forward(){// move forward from position in direction of camera
setCartesian();
x += (Math.sin(yrotrad))*spd;
z -= (Math.cos(yrotrad))*spd;
//y -= (Math.sin(xrotrad))*spd;
body.applyForce(new Vector3f(x,0,z),getThrow());
}//..
public Vector3f getThrow(){// get relative position of the camera
float nx=x,ny=y,nz=z;
float xrotrad, yrotrad;
yrotrad = (float) (yrot / 180 * Math.PI);
xrotrad = (float) (xrot / 180 * Math.PI);
nx += (Math.sin(yrotrad))*2;
nz -= (Math.cos(yrotrad))*2;
ny -= (Math.sin(xrotrad))*2;
return new Vector3f(nx,ny,nz);
}//..
прыгать просто используйте body.setLinearVelocity(new Vector3f(0,jumpHt,0)); и установите jumpHt на любую скорость, какую пожелаете.
Я использую getThrow, чтобы вернуть вектор для других объектов, которые я могу "выбросить" на экран или переносить. Я надеюсь, что ответил на ваш вопрос и не добавил слишком много ненужной информации. Я постараюсь найти источник, который дал мне эту идею. Я считаю, что это было на форумах Bullet.
------- РЕДАКТИРОВАТЬ ------
Извините, что пропустил эту часть
если у вас есть твердое тело, функционирующее должным образом, вам просто нужно получить его координаты и применить его к вашей камере, например:
float mat[] = new float[16];
Transform t = new Transform();
t = body.getWorldTransform(t);
t.origin.get(mat);
x = mat[0];
y = mat[1];
z = mat[2];
gl.glRotatef(xrot, 1, 0, 0); //rotate our camera on teh x-axis (left and right)
gl.glRotatef(yrot, 0, 1, 0); //rotate our camera on the y-axis (up and down)
gl.glTranslatef(-x, -y, -z); //translate the screen to the position of our camera
В моем случае я использую OpenGL для графики. xrot и yrot представляют высоту и угол обзора вашей камеры. Приведенный выше код получает преобразование мира в виде матрицы, и для целей камеры вам нужно только вывести координаты x,y и z, а затем применить преобразование.
отсюда, для перемещения камеры, вы можете установить линейную скорость движения твердого тела для перемещения камеры или приложения силы.
Прежде чем читать этот ответ, я хотел бы отметить, что у меня есть проблема с решением, указанным в моем ответе. Вы можете следить за моим вопросом об этой проблеме, чтобы у вас тоже было решение, если вы воспользуетесь этим ответом.
Так. Во-первых, вам нужно создать новый BoxShape:
CollisionShape cameraHolder = new BoxShape(SIZE OF CAMERAHOLDER);
И добавьте его в свой мир, чтобы он взаимодействовал со всеми другими объектами. Теперь вам нужно изменить все методы движения камеры (не вращения), чтобы эти методы cameraHolder
но не твоя камера. Затем установите положение вашей камеры в положение cameraHolder
,
Опять же, если у вас есть проблема, когда вы не можете правильно двигаться, вы можете проверить мой вопрос и подождать ответа. Вы также можете найти лучший способ сделать это.
Если у вас есть проблемы или вы не поняли что-то об ответе, пожалуйста, укажите это как комментарий.