[转载]等角(斜45度)游戏与数学

原文链接:http://www.javaeye.com/articles/1225

1984年欧洲的玩家被一款当时发布的游Knight Lore震惊了。这款2d游戏居然相当真实的模拟了3d环境,而当时游戏的发布平台是 ZX Spectrum, 48K的内存。这个技术就是isometric perspective(等角投影) 。后来大菠萝、最终幻想等游戏均采用了这种投影技术。
等角投影是指在一定范围内,投影面上任何点上两个微分线段组成的角度投影前后保持不变的一类投影。任何点上二微分线段组成的角度投影前后保持不变的一类投影。是角度和形状保持正确的投影,也称正形投影。这种投影类型不同于真3D常见的透视投影,并不以物体对摄像头的远近关系而对其缩放,x,y和z轴的投影角度均为120度。但是出于计算机渲染像素图像图形的特性,和开发方便,很多游戏实际上使用的是二等角投影。
由等角坐标变换到屏幕坐标可以参考这个公式:

由屏幕坐标变换到等角坐标:

以下文章摘自http://www.compuphase.com/axometr.htm:
The figure below shows a cube in the isometric projection as defined by ISO 5456-3.The first object from the left in the figure is the cube unadorned; the second object is the same cube with angles and measures annotated around it. The third and fourth graphics are the top and side views of the perspective scene and they give the camera position that fits the perspective view. The camera position is what you would feed into a 3D renderer (or ray tracer) to create the sprites or tiles for the isometric projection.

Computer games with isometric maps are often tile-based. To make tiles match, the game designer must take into account how diagonal lines are plotted in discrete steps (Bresenham and all that). As it turns out, a line at 30 degrees (sine is 0.5) produces steps that are too irregular. A line at an angle where the tangent is 0.5 does have a nice regular pattern: two steps to the right, one step up. Thus, the isometric projection used by most games tilt the x- and z-axes with approximately 27 degrees (the exact angle is "arctangent(0.5)"). By the way, because the tangent of the angle of the rhombus is 0.5, the rhombus is twice as wide as it is high. This is why many sources mention a 1:2 scale for isometric perspectives. (To make the edges of the rhombuses match, the width of the rhombus should be a multiple of four pixels and the height should be one pixel less than ½ width. In other words, the height:width ratio of a rhombus is usually not exactly 1:2, but rather near 1:2.1. This makes no difference for the principles of the isometric perspective.)
Again, the figure below shows what this isometric projection looks like.

Flash游戏采用等角投影的有PlayFish的餐厅(需要FQ):

时间: 2024-12-02 13:40:44

[转载]等角(斜45度)游戏与数学的相关文章

汽车倒车入库技巧图解--倒车方式一字倒车-----非字倒车---斜45度倒车

汽车倒车入库技巧图解 浙江奉化一小区车库里致夫妻双双遇难的倒车悲剧,女司机倒车撞死丈夫自己也被夹死.让人心惊,也给不少倒库不熟练的新手敲响了警钟.如果你的倒车技术不扎实,不妨学习一下这张倒车入库技巧详解图.不紧张.多练习,一次性入库,你也可以!安全驾驶,出入平安! 汽车倒车入库技巧图解 “一”字形停车位倒车技巧图解: “非”字形停车位倒车技巧图解 斜45度停车位倒车技巧图解

洛谷P1199 三国游戏 博弈论 数学

洛谷P1199 三国游戏博弈论 数学 这道题 其实 人是必胜的 能取到的最大值 为 每行第二大值中的最大值 为什么呢 假使第一次我们取到了我们心中的那个答案的所在行 那么接着电脑会取 这一行最大值的对应行 那么我们来分析一下电脑取的那个数在他取的那行的特点 首先我们假设其不是最大值,因为矩阵中任意两个数不相同 所以也就是说还有个数比他大,然后就是说电脑取的第二大或者第n大值就已经比我们取的第一大值要大了,说明我们取的行并不是每行第二大值中的最大值所在的行2.也就是说这个数必定为该行中的最大值 那

java将矩阵旋转45度输出

例如: A B C D E F G H I J K L M N O P Q R S T U V W X Y E D J C I O B H N T A G M S Y F L R X K Q W P V U 思路如上图: 在菱形之外的都是空格,菱形之内(可以使用函数判断)有两种点,一种是有字符,一种是空格 可以发现,有字符的位置(col-row)%2 == 0:接下来寻找45度菱形和矩形的对应关系,row'=(col-row)/2 ,col'=col-row' 完整代码如下: public cl

cocos2dx-3.10 45度地图 tiledmap+A*寻路

45度地图 寻路主要参考了某位博客文章,链接如下: cocos2dx 45度Staggered格式A*寻路 曼哈顿算法(待优化) 另外也参考了某位作者的正方形A* 寻路,所以这套A* 算法是可以兼正方形寻路也可以45度菱形寻路的. 现贴下代码: 地图类: #ifndef _MAP_LAYER_H_ #define _MAP_LAYER_H_ #include <cocos2d.h> #include "Role.h" #include "Astar.h"

HTML5 Canvas 描画旋转45度佛教万字

效果如下: 代码如下: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <head> <title>旋转45度佛教万字</title> </head> <body onload="draw

mir9-lua——《热血沙城》45度ARPG手游-Lua移植版

mir9--<热血沙城>,是9秒论坛开源的一个使用Cocos2d-x-2.2.1引擎开发的45度ARPG手游Demo,源代码为c++.mir9-lua是mir9的Lua移植版,使用Quick-Cocos2d-x-2.2.5引擎开发.由于移植得比较匆忙,代码写得可能比较混乱,请见谅. 已知Bug: 1.Label字体在Windows上面显示模糊 2.小地图在已是最左或最下的情况下,仍可以向上或或向滑动一段距离,并且不弹回原样 3.切换地图后小地图还是打开状态,并且显示的是之前的小地图 4.人物移

己知点坐标和半径R,求每隔45度半径与同心圆交汇的坐标

需求如下图 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>javascript己知点坐标

用c++实现一个n*n矩阵,矩阵沿着45度递增,形成zigzag数组

#include<stdio.h> #include<iostream> using namespace std; int main() { int N; int s, i, j; int squa; cin>>N; squa = N*N; /*为指向int型指针的指针分配空间, 该指针指向n个int型指针*/ int **a = (int **)malloc(N* sizeof(int)); if (a == NULL) return 0; for (i = 0; i

arduino控制dynamixel AX-12A的机械臂每个关节转45度

1.每个关节转45,往复循环 #include <ax12.h> void setup() { SetPosition(1,511); //set the position of servo # 1 to '511' SetPosition(2,511); SetPosition(3,511); SetPosition(4,511); SetPosition(5,400); delay(100);//wait for servo to move } void loop() { //increm