これはここ数日私を殺してきました。冗談ではありませんが、私はこれを解決しようとして本当に強調してきました。
私は現在、アフィン変換行列を使用してHTML5で等角投影を作成しようとしています。45度回転した正方形のタイル(基本的には正方形のキャンバス上の正方形のひし形)を受け取ります。次に、x方向またはy方向にデルタがあるかどうかに応じて、軸の1つをスケーリングします。次に、フィットする係数で軸を歪めます。次に、最初の回転を-45度回転させて無効にします。
現在、私のアフィン行列は次のとおりです。
// note: the difference in z is about 10 in this example,
// so, xDiff is usually 40
var xDiff = 4 * (center.z - map[x+1][y].land.z);
var yDiff = 4 * (center.z - map[x][y+1].land.z);
var matrix = multiplyAll(
// Rotation
[COS45, SIN45,
-SIN45, COS45],
// Scale in each respective axis
[(44+yDiff)/44, 0,
0, (44+xDiff)/44],
// Skew each axis
[1, -yDiff/(44+yDiff),
-xDiff/(44+xDiff), 1],
// Negate the rotation
[NCOS45, NSIN45,
-NSIN45, NCOS45]
);
次に、次を使用して描画します。
// the map has its own x & y values which directions are determined by the red x & y arrows in the picture
// pX & pY are the point relative to the canvas origin
var pX = x * 22 - y * 22 + 22;
var pY = y * 22 + x * 22 - 22 - (center.z * 4);
context.setTransform(matrix[0], matrix[1],
matrix[2], matrix[3],
300, 100);
//m_Context.drawImage(image, pX, pY);
drawDiamond(pX, pY, true); // draws a 44x44 diamond
ご覧のとおり、変換された行列は、変換されたx軸に対して描画されています(「新しい」x軸の傾きはyDiff / 44だと思います)。変換された結果が正しい位置になるように図形を描画する方法がわかりません。使用pY = x * 22 - (yDiff/10);
することでポイントが近づくように見えますが、乱数を差し込むことでかなり推測できました。
tl; dr:
- 変身しました
- タイルがあるべき場所の座標があります(変換されていない場合)
- 変換されたタイルの座標が、変換されていない場合の座標と同じになるように、必要なオフセットを計算するにはどうすればよいですか?
PS:オフセットの計算方法を見つけたら、下部の奇妙なダイアモンドは正しく作成できるため、今のところ無視できます。