2011-03-12 2 views
-1

안녕하세요. 3D 로테이션에 대한 도움이 필요합니다. 나는 게임 개발을 많이하지 않고 학계에서 배운 것을 간신히 기억합니다. 나는 3d 세계 (Minecraft)에서 2 차원 이미지를 렌더링하고 플레이어의 목표 좌표를 이미지의 왼쪽 아래쪽에 맞 춥니 다.3d 변환 n00b는 오픈 소스 mod에 대한 도움이 필요합니다.

  • XZ의 비행기는 가
  • 이미지는 항상 90도에있을 것입니다
  • Y 수직
  • 이다 게임에서 걷기면 내가 이미지를 렌더링 할 때 문제가

각도입니다 가로로 보면 대부분 작동하지 않습니다. 때로는 수직적 인 경우도 있습니다. 내가 수직으로 렌더링 할 때, 그것은 아름답게 작동합니다. 나는 그 나쁜 수학을 확신합니다. 나는 재판을하고 대부분은 내 길을 비췄다. 피치와 요는 플레이어에 대한 시야각입니다. 이것은 내가 이미지 위치와 방향을 설정하는 데 사용하려고하는 것입니다.

이것은 오픈 소스 Minecraft 서버 플러그인 용입니다. 살펴 주시기 바랍니다 :

https://bukkit-modders.googlecode.com/svn/trunk/

을 또한,이 논리가 좀 더 매트릭스/벡터 부두를 사용하여 감소시킬 수있다 보면, 의견을 주시기 바랍니다.

private Matrix4d calculateOrientation(Player player) { 

    Matrix4d orientation = new Matrix4d(); 
    orientation.setIdentity(); 

    Location location = player.getLocation(); 

    Matrix4d rotY = new Matrix4d(); 
    rotY.setIdentity(); 

    double yaw = Math.abs(location.getYaw()); 

    yaw %= 360; 

    double baseAngle = 0; 
    int sign = (location.getYaw() < 0) ? -1 : 1; 

    if (yaw > (90 - 45) & yaw < (90 + 45)) { 
     baseAngle = 90; 
    } else if (yaw > (180 - 45) & yaw < (180 + 45)) { 
     baseAngle = 180; 
    } else if (yaw > (270 - 45) && yaw < (270 + 45)) { 
     baseAngle = 270; 
    } 

    // Alight the left edge with the targeted location 
    //I have no idea why this works. 
    if (sign > 0) { 
     baseAngle -= 180; 
     rotY.rotY(Math.toRadians(baseAngle)); 
    } else { 
     baseAngle += 180; 
     rotY.rotY(Math.toRadians(baseAngle)); 
    } 

    Matrix4d rotXZ = new Matrix4d(); 
    rotXZ.setIdentity(); 

    double rotX = 0; 
    double rotZ = 0; 

    if (location.getPitch() > 45) { 
     //Rendering Flat in the plane of XZ 
     //This block is pretty broken 
     if (baseAngle == 0) { 
      rotX = 90; 
     } else if (baseAngle == 90) { 
      rotZ = 90; 
     } else if (baseAngle == 180) { 

     } else if (baseAngle == 270) { 
      rotZ = -90; 
     } 
    } 

    rotXZ.rotX(Math.toRadians(rotX)); 
    rotXZ.rotZ(Math.toRadians(rotZ)); 

    orientation.mul(rotXZ); 
    orientation.mul(rotY); 

    return orientation; 
} 

}

답변

0

확인을 클릭합니다. 나는 나의 대답이 있지만 아직 해결책을 구현하지 못했다. 요약하면, Y에 대한 회전은 90도 이상일 때 좋지 않으며 X 및 X 회전의 동등한 조합을 사용해야합니다.

오른손잡이 좌표계와 몇 가지 미친 수학에 관한 것!

관련 문제