2013-07-30 3 views
1

카메라를 설치했는데 WASD로 이동하고 마우스로 뷰를 회전 할 수 있습니다. 그러나 이제 문제가 생깁니다 : 카메라/플레이어에 물리를 추가하여 다른 jBullet 객체와 "상호 작용"하고 싶습니다. 어떻게해야합니까? 카메라에 RigidBody를 생성하고 거기에 위치를 저장하는 것에 대해 생각했습니다. jBullet이 카메라에 물리학을 적용 할 수 있도록했습니다. 그런 다음, 뭔가 (위치)를 바꿀 필요가있을 때 RigidBody에서 간단히 변경할 수 있습니다. 그러나 나는 그 위치를 편집 할 방법을 찾지 못했습니다.LWJGL jubullet을 사용하는 1 인칭 카메라

나를 올바른 방향으로 밀어 주거나 ​​예제 소스 코드를 제공 할 수 있습니까?

답변

1

며칠 전 나 자신에게 같은 질문을하고있었습니다. Sierox가 말한 것처럼 나의 해결책이 있었다. BoxShape의 RigidBody를 만들고이를 DynaicsWorld에 추가하십시오. 카메라를 움직이려면 강체에 힘을가하십시오. 힘이 가해지지 않을 때, 즉 플레이어가 버튼을 누르지 않으면 카메라를 멈추게하기 위해 선형의 경우 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 (새 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 좌표 만 가져 와서 변환을 적용하면됩니다.

여기에서 카메라를 움직이려면 강체의 선형 속도를 설정하여 카메라를 움직이거나 힘을 가할 수 있습니다.

1

이 답변을 읽기 전에 답변에 명시된 해결책에 문제가 있음을 말씀드립니다. 이 문제를 해결하기 위해 my question을 팔로우하면이 답변을 사용할 수 있습니다.

So. 먼저, 새로운 BoxShape를 만들어야합니다.

CollisionShape cameraHolder = new BoxShape(SIZE OF CAMERAHOLDER); 

그리고 다른 모든 개체와 상호 작용하도록 추가하십시오. 이제 카메라 이동 (회전 없음)에 대한 모든 메서드를 변경하여 메서드가 cameraHolder을 이동하지만 카메라는 이동하지 않도록해야합니다. 그런 다음 카메라의 위치를 ​​cameraHolder의 위치로 설정하십시오.

다시 제대로 이동하지 못하는 문제가있는 경우 my question을 확인하고 답변을 기다릴 수 있습니다. 또한이를 수행하는 더 좋은 방법을 찾을 수 있습니다.

문제가 있거나 답을 이해할 수 없다면 의견을 말씀해주십시오.

+0

하지만 카메라를 어떻게 이동합니까? – JangoBrick

+0

현재 XYZ를 기본적으로 증가 및 감소 시켜서 이동 중입니다. 그러나 나는 나의 대답에서 말했듯이, 이것은 적절하게 작동하지 않고 있으며, 나는 그것에 대해 미해결 질문을 가지고있다. – Sierox