2011-03-12 45 views
-1

嘿,所有。我需要一些3d旋轉的幫助。我沒有做太多的遊戲開發,也沒有記住我在學術界學到的東西。我在3D世界(Minecraft)中渲染2D圖像,並讓玩家的目標座標與圖像的左下角對齊。3d轉換n00b需要幫助開源mod

  • XZ的平面是在遊戲
  • Y是垂直
  • 的可行走表面
  • 圖像將總是在90度角

問題是,當我嘗試呈現圖像橫向上,它大多不起作用。有時它會水平,有時垂直。當我垂直渲染時,它的效果非常好。我相信它的數學不好。我通過大部分的嘗試和錯誤的方式。俯仰和偏航是相對於玩家的視角。這是我試圖用來設置圖像的位置和方向。

這是一個開源的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度時,Y的旋轉不好,而應該使用X和X旋轉的等效組合。

一些關於右手座標系和一些瘋狂的矩陣數學!