魏森 发表于 2010-6-8 09:41:05

3D魔方的源程序

我自己设计的魔方程序

[ 本帖最后由 魏森 于 2010-6-9 19:21 编辑 ]

小明的马甲 发表于 2010-6-8 22:31:00

今天魔方吧什么情况。。。。。。

chicksong 发表于 2010-6-8 23:00:16

这就叫好人啊。。。mf02 mf02

Paracel_007 发表于 2010-6-9 00:02:35

3D魔方是哪个程序?

魏森 发表于 2010-6-9 19:20:20

程序说明

         续接一楼     。。。

我觉得D3D的方面应该没什么好说的,而且我做的也很乱,效率不高,就不提了,下面画个图,说明下魔方的操作方面的构思吧。
关于魔方根据鼠标的移动而移动,我是把当前选定的小块局部坐标投影到投影平面上,再根据鼠标的移动方向的单位矢量和坐标轴的夹角来判断旋转方向。旋转时,是将要旋转的面统一设置一个父物体,只旋转父物体,省去了对单个物体的操作。在释放鼠标按键时,再判断要旋转的角度,然后根据角度改变模型的材质和魔方的结构数据(用做判断是否完成),其实每个小方块的位置在每次旋转结束后都会回到原位置。

http://bbs.gameres.com/upload/sf_200697164949.jpg

魏森 发表于 2010-6-9 19:22:22

程序中使用的外部文档结构

当时做这个程序时总觉得改变模型结构要重新编译很麻烦,就花了几天时间做了文件读取部分,因为以前接触的VRML,所以决定以它为例。
做着做着才发现我以前的想法有些太简单了,后来总算凑和着做了出来,用了以前觉得没什么用的堆栈,才发现解释型的文件用堆栈做很简单。
举个例子:
object
{
#
盒子一

box

{
#尺寸 长 宽 高 以空格或逗号分隔

size{1 3 15}
#平移 x y z 轴分量 以空格或逗号分隔

translate {-2.0 0.0 0.0}
#旋转 x y z 轴弧度分量 以空格或逗号分隔

rotate {0.0 1.0 0.0}
#缩放 x y z 轴比例分量 1为不缩放 以空格或逗号分隔

scale {1.0 0.5 1.0}
#box名称

box name {wallmf1}
#环境色 r g b 分量
0到1浮点数 以空格或逗号分隔

ambient color {1.0 0.0 1.0}
#漫反射色 r g b 分量
0到1浮点数 以空格或逗号分隔

diffuse color {1.0 1.0 1.0}

}
#
盒子二

box

{

size{1 3 15}

translate {2.0 0.0 0.0}

rotate {0.0 1.0 0.0}

scale {1.0 1.0 1.0}

box name {wallmf1}

ambient color {1.0 0.0 1.0}

diffuse color {1.0 1.0 1.0}

}
}

我的方法是以"{" 和 "}" 为界定符,遇到"{" 就将缓冲内的字符做为操作符进行处理,然后把操作状态压入堆栈,清除缓冲。遇到"}"就将缓冲内的字符作为参数进行处理,根据堆栈内的状态,处理完后,将堆栈内的状态弹出一个,清除缓冲。
你可以将上面那一段存入任意文件名的文件(因为是文本,存入文本文件修改起来更简单),然后将文件拖到magicube主程序上执行,就可以显示根据文件构造的模型。关键字全为小写,暂时只支持box一种,"#" 后的一行为注释,不做处理。

魏森 发表于 2010-6-9 19:52:23

自己给自己顶一个。。
页: [1]
查看完整版本: 3D魔方的源程序