
上面是从右下方向左上方沿着地面行走的角色的四个图像.您可以在第三个面板中看到绘图顺序不正确.
这里似乎没有"正确的顺序".例如,如果不是一个小家伙,我们有一只偷猫的精灵穿过门,那么无论你是先把门还是先把猫拉出来,都是错的.

其他游戏引擎如何处理这个?一些黑客可以防止这种情况发生?手工绘制z缓冲区?还有其他选择没有发生在我身上吗?
可能重复:
使用opengl进行真正的等轴测投影
我想使用Blender3d使用的相同等距渲染进行渲染,我该怎么做?只需调用glMultMatrix()就可以了吗?我尝试使用谷歌搜索,但无法找到任何可能导致这种渲染模式的工作矩阵.我试过这个http://en.wikipedia.org/wiki/Isometric_projection,但它只是渲染得非常奇怪.
这是我现在使用的矩阵,以正常的视角渲染:
GLdouble f = cotan(fovy/2.0);
GLdouble aspect = (GLdouble)width/(GLdouble)height;
IsoMatrix.x[0] = f/aspect;
IsoMatrix.y[0] = 0;
IsoMatrix.z[0] = 0;
IsoMatrix.w[0] = 0;
IsoMatrix.x[1] = 0;
IsoMatrix.y[1] = f;
IsoMatrix.z[1] = 0;
IsoMatrix.w[1] = 0;
IsoMatrix.x[2] = 0;
IsoMatrix.y[2] = 0;
IsoMatrix.z[2] = (zfar+znear)/(znear-zfar);
IsoMatrix.w[2] = (2.0*zfar*znear)/(znear-zfar);
IsoMatrix.x[3] = 0;
IsoMatrix.y[3] = 0;
IsoMatrix.z[3] = -1;
IsoMatrix.w[3] = 0;
glMultMatrixd((GLdouble *)&IsoMatrix);
Run Code Online (Sandbox Code Playgroud)
我如何改变它以便产生:http: //rvzenteno.files.wordpress.com/2008/10/rvz_018.jpg?
我正在尝试创建一个使用侧面"等距"视图和透明图块的Web应用程序/游戏.我可以使用PHP公式显示它们(但不是很好),只需将每个div(每个tile)设置为position:absolute并设置top和left参数.问题是如何捕获瓷砖上的点击,让透明位的瓷砖点击到它下面的瓷砖.
我的问题的一个例子是http://stuff.adammw.homeip.net/other/fv/farmville_2.html
我在等距墙上遇到了一些麻烦.
我正在使用从前到后渲染方法绘制等距地砖,它工作正常.我还将我的地砖正确排列在一个漂亮的网格中.代码(这似乎是等距地板绘图的标准)如下:
for(int x = 0; x < 6; x++){
for(int y = 3; y >=0 ; y--){
int xCo = (y+x)*(tileWidth/2);
int yCo = (x-y)*(tileHeight/2);
tile.draw(g, xCo, yCo);
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个漂亮的小地板:
网格由此图块构成:

不幸的是,当我对墙壁使用相同的逻辑时,一切都是正确的.
for(int x = 0; x < 6; x++){
for(int y = 3; y >= 0 ; y--){
int xCo = (y+x)*(wallWidth()/2);
int yCo = (x-y)*(wallHeight()/2);
walls.draw(g, xCo, yCo);
}
}
Run Code Online (Sandbox Code Playgroud)
我用它作为我的墙砖:

(这是谷歌图片搜索的占位符,但它应该都是一样的)
这是我得到的结果:
我的墙壁的渲染顺序显然是正确的,更近的墙壁渲染在更远的墙壁上,这是我想要的,但定位也是非常不正确的,我不知道我应该如何纠正这个缺乏使用像素值.
作为参考,我确实使用硬编码像素值进行了试验,因为我发现从一个墙的右角到下一个墙的右角,变化恰好是(200,-100)像素.当我为我的渲染循环帐户
int xCo = (x+y)*200;
int yCo = (y-x)*-100;
Run Code Online (Sandbox Code Playgroud)
它工作正常,但这不是一个可行的解决方案,因为它不允许任何多功能性.
因此,寻找有关如何使我的等距墙排列的建议.我究竟做错了什么?
谢谢!
我有一个基于图块的等距世界,我可以通过使用以下计算来计算特定(鼠标)坐标下面的哪个图块:
function isoTo2D(pt:Point):Point{
var tempPt:Point = new Point(0, 0);
tempPt.x = (2 * pt.y + pt.x) / 2;
tempPt.y = (2 * pt.y - pt.x) / 2;
return(tempPt);
}
function getTileCoordinates(pt:Point, tileHeight:Number):Point{
var tempPt:Point = new Point(0, 0);
tempPt.x = Math.floor(pt.x / tileHeight);
tempPt.y = Math.floor(pt.y / tileHeight);
return(tempPt);
}
Run Code Online (Sandbox Code Playgroud)
(摘自http://gamedevelopment.tutsplus.com/tutorials/creating-isometric-worlds-a-primer-for-game-developers--gamedev-6511,这是一个flash实现,但数学是相同的)
在这些情况下,由于一些具有较高高度的瓷砖的高度,后面的瓷砖(或瓷砖的一部分)被遮盖并且不应该由鼠标选择,而是选择前面的瓷砖它的.如何在考虑到瓷砖高度的情况下通过鼠标坐标计算瓷砖?
我正在使用javascript和canvas实现.
我正在幕后进行3D模拟,同时在我的2d等距引擎中渲染世界.我之前从未做过等距引擎,而且我的矩阵数学一般都生锈了,所以我遇到了问题.
我有一个投影矩阵,其最简单的形式是:
0.7 0.35 0
0 -0.87 0
-0.71 0.35 1
Run Code Online (Sandbox Code Playgroud)
由于我的发动机坐标系在左上方为0,0,右侧/东侧为+ X,南侧为+ Z,因此会翻转几个标志.
现在,相反的是:
1.4080 0.5670 0.0000
0.0000 -1.1490 0.0000
1.0000 0.8050 1.0000
Run Code Online (Sandbox Code Playgroud)
现在,这些矩阵大多有效.
例如
WC: 500,0,500 = 屏幕: -1.44,350,500(X和Y是正确的)
WC: 0,0,500 = 屏幕: -355,175,500 (X和Y再次正确)
但是,现在如果你需要走另一条路,你就不再拥有那个方便的Z值了
屏幕: -1.44,350,0 = WC: -2,-402.97,0(所以,垃圾.)
还有更多 - 一旦我不再具有Z值,我就无法从屏幕坐标中找回世界坐标.
这里的解决方法是什么?
编辑
我应该指出,非项目的目的是为了获取鼠标光线.
这似乎只是我对我正在做的事情的误解,这让我搞砸了.
我正在写一个等距的瓷砖游戏.每块瓷砖的宽度是它的两倍(w:h = 2:1).地图中的所有图块都具有相同的大小,其宽度和高度是已知的(TileWidth和TileHeight).
可以有任意数量的列(> 0)和行(> 0).
我正在努力想出一个公式来计算完全绘制的地图的宽度和高度.这需要是从最顶部到最底部以及从最左侧到最右侧的距离.由于列数和行数可以变化(因此地图并不总是完美的钻石),因此证明非常难!
我对LibGDX和平铺地图有些问题.我来自Corona SDK(Lua),我使用Lime(第三方lib来处理tmx地图),现在我切换到LibGDX并遵循这个最近的功能:GraphicsTileMaps
我能够使用IsometricTiledMapRenderer渲染器从资源加载等轴测图,并OrthographicCamera显示地图(所有工作都在维基页面中描述).我还能够以编程方式填充地图图层上的一些图块,但是当我尝试使用时,我的问题就出现了AnimatedTiledMapTile:
map = new TmxMapLoader().load(...);
TiledMapTileLayer layer = (TiledMapTileLayer) map.getLayers().getLayer("layer1");
TiledMapTileSet tileset = map.getTileSets().getTileSet("tileset1");
TiledMapTile grassTile = tileset.getTile(4);
TiledMapTile rockTile = tileset.getTile(6);
Array<StaticTiledMapTile> playerTileArr = new Array<StaticTiledMapTile>();
playerTileArr.add((StaticTiledMapTile)tileset.getTile(7));
playerTileArr.add((StaticTiledMapTile)tileset.getTile(8));
Cell grass = new Cell();
grass.setTile(grassTile);
Cell player = new Cell();
player.setTile(new AnimatedTiledMapTile(0.1f, playerTileArr));
layer.setCell(0,0, grass); // <--- This works.
layer.setCell(0,1, player); // <--- When I try this, it causes
// a NullPointerException.
renderer = IsometricTiledMapRenderer(map, 1 / 30f);
...
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?我找到了一个AnimatedTiledMapTile …
我正在努力在简单的等距Sprite Kit游戏中实现点击处理.
我有一个游戏场景(SKScene)和一个包含多个Tile对象(SKSpriteNode)的Map(SKNode).
以下是地图的屏幕截图:

我希望能够检测到用户点击的磁贴,所以我在Tile对象上实现了mouseDown.这是我在Tile.m中的mouseDown:
-(void)mouseDown:(NSEvent *)theEvent
{
[self setColorBlendFactor:0.5];
}
Run Code Online (Sandbox Code Playgroud)
代码似乎工作正常,但有一个小问题:节点重叠,并在节点的透明部分检测到click事件.示例(已添加rects以仅说明问题.它们未在逻辑中使用):

如您所见,如果我点击图块7的左上角,则图块8变为透明.

我尝试了在点击位置获取所有节点并检查点击是否在CGPath内部而没有成功(我认为坐标有问题).
所以我的问题是如何检测纹理上的点击而不是透明部分?或者我的方法可能是错的?
任何意见,将不胜感激.
我已经开始做一个小的swift/spritekit项目来教我自己的游戏开发.它以等距地图开始,我设法绘制.但是我在地图的不同瓷砖上获得精确的触摸位置时遇到了麻烦.它有效,但有点不合适,似乎不一致.
这是我的功能:
class PlayScene: SKScene {
let map = SKNode()
override func didMoveToView(view: SKView) {
let origin = view.frame.origin
let mapOrigin = CGPointMake(origin.x + self.frame.width / 4, origin.y - self.frame.height / 4)
let mapConfig: Int[][] =
[[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[2, 2, 2, 2, 1, 2, 2, 2],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, …Run Code Online (Sandbox Code Playgroud) isometric ×10
math ×3
java ×2
javascript ×2
sprite-kit ×2
tiles ×2
3d ×1
animation ×1
c++ ×1
drawing ×1
graphics ×1
html ×1
ios ×1
libgdx ×1
matrix ×1
opengl ×1
swift ×1
tiled ×1
transparent ×1
trigonometry ×1