标签: isometric

通过等距瓷砖的通道

在此输入图像描述 在此输入图像描述 在此输入图像描述 在此输入图像描述

上面是从右下方向左上方沿着地面行走的角色的四个图像.您可以在第三个面板中看到绘图顺序不正确.

这里似乎没有"正确的顺序".例如,如果不是一个小家伙,我们有一只偷猫的精灵穿过门,那么无论你是先把门还是先把猫拉出来,都是错的.

在此输入图像描述 在此输入图像描述

其他游戏引擎如何处理这个?一些黑客可以防止这种情况发生?手工绘制z缓冲区?还有其他选择没有发生在我身上吗?

graphics isometric

9
推荐指数
1
解决办法
758
查看次数

如何用等角透视渲染?

可能重复:
使用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

c++ opengl isometric

9
推荐指数
1
解决办法
4483
查看次数

带有半透明点击图块的HTML/JS/CSS等距网格

我正在尝试创建一个使用侧面"等距"视图和透明图块的Web应用程序/游戏.我可以使用PHP公式显示它们(但不是很好),只需将每个div(每个tile)设置为position:absolute并设置top和left参数.问题是如何捕获瓷砖上的点击,让透明位的瓷砖点击到它下面的瓷砖.

我的问题的一个例子是http://stuff.adammw.homeip.net/other/fv/farmville_2.html

html javascript tiles transparent isometric

8
推荐指数
1
解决办法
7693
查看次数

绘制等距墙

我在等距墙上遇到了一些麻烦.

我正在使用从前到后渲染方法绘制等距地砖,它工作正常.我还将我的地砖正确排列在一个漂亮的网格中.代码(这似乎是等距地板绘图的标准)如下:

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)

它工作正常,但这不是一个可行的解决方案,因为它不允许任何多功能性.

因此,寻找有关如何使我的等距墙排列的建议.我究竟做错了什么?

谢谢!

java math isometric

8
推荐指数
1
解决办法
1819
查看次数

如何计算等距世界中鼠标下方的图块索引,同时考虑图块高程

我有一个基于图块的等距世界,我可以通过使用以下计算来计算特定(鼠标)坐标下面的哪个图块:

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实现.

javascript isometric

8
推荐指数
1
解决办法
892
查看次数

在屏幕上取消投影指向等距投影的世界

我正在幕后进行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值,我就无法从屏幕坐标中找回世界坐标.

这里的解决方法是什么?

编辑

我应该指出,非项目的目的是为了获取鼠标光线.

这似乎只是我对我正在做的事情的误解,这让我搞砸了.

math 3d matrix linear-algebra isometric

7
推荐指数
1
解决办法
2166
查看次数

如何计算等距矩形/正方形的高度和宽度

我正在写一个等距的瓷砖游戏.每块瓷砖的宽度是它的两倍(w:h = 2:1).地图中的所有图块都具有相同的大小,其宽度和高度是已知的(TileWidth和TileHeight).

可以有任意数量的列(> 0)和行(> 0).

我正在努力想出一个公式来计算完全绘制的地图的宽度和高度.这需要是从最顶部到最底部以及从最左侧到最右侧的距离.由于列数和行数可以变化(因此地图并不总是完美的钻石),因此证明非常难!

math drawing trigonometry tiles isometric

7
推荐指数
1
解决办法
6600
查看次数

LibGDX:如何在等距平铺地图上做动画?

我对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 …

java animation isometric libgdx tiled

7
推荐指数
1
解决办法
3475
查看次数

检测等距纹理上的单击/触摸

我正在努力在简单的等距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内部而没有成功(我认为坐标有问题).

所以我的问题是如何检测纹理上的点击而不是透明部分?或者我的方法可能是错的?

任何意见,将不胜感激.

编辑:对于我最终使用的解决方案感兴趣的人,请在此处查看我的答案

isometric sprite-kit

7
推荐指数
1
解决办法
1705
查看次数

Swift Spritekit等距地图触摸位置

我已经开始做一个小的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 ios sprite-kit swift

6
推荐指数
1
解决办法
2286
查看次数