Tuesday, October 03, 2006

GHashTutorial

http://wiki.blendercn.org/index.php/BlenderDev/GHashTutorial

什么是ghash?
有时候你需要简单的查找列表,即便查询的数据链的大小未知,但是又要快速的存取(非线形搜索)。一个很好的办法就是使用hash表。在对未知任务没有线索 的时候就可以设置自己的hash表。但是为什么要重复造轮子呢?在blender代码中已经有一个完整的一般性hash数据结构存在了。ZR编写的 ghash让你可以使用最少的代码来设置一个hash。它可以为你提供一些选项。。。

一个可以索引的hash表
一个元素集


hash 表
一个hash表是一个让key和value配对的存储结构。让你可以通过key来找到value。ghash使用了指针来指定key 和 value。因为是用空指针来设置的,所以他们可以指向任何的类型和对象。一个应用的场合就是,你可能会用一个数据结构来存储一个editedge的临时 变更数据。每一个edit edge,你可以使用editedge*来作为你的key,然后动态分配一定的内存给你的更改数据结构再付value给他们,你就可以在需要这些改变数据 的时候传一个key给hash,它就会返回指针指向的value。

一个元素集
假设,你只是想创建一个元素的动态链表。只要将key都给成null值。然后你就可以检查key是否在hash中,或者设置一个迭代器来遍列你hash的key。

使用ghash
最简单的ghash
我们从头文件开始。
代码:
#include "BLI_ghash.h"

声明我们的ghash,然后创建我们的新数据结构,通过整型函数指针传递hash,和hash需要用到的比较函数。函数的参数可以确定key和value如何匹配或者被hash,也可以用到更特殊的hash表中。
代码:
GHash *gh;
gh = BLI_ghash_new(BLI_ghashutil_ptrhash,BLI_ghashutil_ptrcmp);

当需要在hash中添加项目的时候,我们调用BLI_ghash_insert传递key和value给hash,这里key和value都是指针。
代码:
BLI_ghash_insert(gh, key, value);


当我们给函数 BLI_ghash_lookup一个key值,我们就可以返回一个value值。
代码:
value = BLI_ghash_lookup(gh, key);


创建一个动态对象集的办法就是放一个key和一个以null为值的value到hash,然后,使用 BLI_ghash_haskey 来看这个元素是否在hash中,返回的是1代表存在,0代表不存在。
代码:
BLI_ghash_haskey(gh,key)


使用下面函数来检查大小
代码:
BLI_ghash_size(gh)


如果所有的过程都完了,你也玩累了请记住要用下面的语句来清空。
代码:
BLI_ghash_free(gh, NULL, NULL);

Using An Iterator使用迭代器

创建了hash以后,我们还得逐个的遍历它,这样的话就得使用iterator。记住在使用iterator的同时不要向hash中插入元素,也不要将它释放清空。
我们先得声明我们的迭代器
代码:
GHashIterator* ghi;

然后再这样将它初始化,
代码:
ghi = BLI_ghashIterator_new(gh);

使用下面这个函数,它就会从第一个key开始完全逐个遍历所有key
代码:
BLI_ghashIterator_step(ghi);

下面这两个帮我们把key或者value获取,他们会返回key或者value,如果iterator正常的跑完了整个hash,你会从他们两得到相同的null。
代码:
BLI_ghashIterator_getKey(ghi);
代码:
BLI_ghashIterator_getValue(ghi);

iterator是否完成工作可以用它来测试,1为完成,0为没有。
代码:
BLI_ghashIterator_isDone(ghi);

然后释放整个iterator。
代码:
BLI_ghashIterator_free(ghi);

这里有一个例子,用来打印hash中的所有元素。
代码:
void print_hash(GHash *gh)
{ GHashIterator *ghi = BLI_ghashIterator_new(gh);
for (; BLI_ghashIterator_isDone(ghi); BLI_ghashIterator_step(ghi))
{ printf("Key(%p) : Value(%p)\n", BLI_ghashIterator_getKey(ghi), BLI_ghashIterator_getValue(ghi)); }
BLI_ghashIterator_free(ghi);
}

Saturday, September 16, 2006

BDDTR计划

时间暂时定在明年春节后。
以前我翻译的文章并不能准确的表达如何作为一个开发者/开源爱好者应该做些什么准备。
一些词汇翻译得过于生硬,而且没有把握住整个blender/图形学/开放源代码开发的要决,现在看来,那些已经变成中文的文章都显得有点生硬。
整个现在还在wiki:wiki.blendercn.org 开了一些比较系统的图形学/计算机基础教程,我有时间一定会全力翻译,只是希望做开源程序的人越来越多,从整个文明来讲,知识越开放,进化越迅速,什么专利,自主知识产权都是商人们给超过300%利润披上的一件合法的羊皮!
今年已经没有什么时间来完成这项任务了,现在做的事情堆积如山,慢慢解决才行。
translate refactor??
BDDTR
只有身在此山,才知此山的艰辛和壮丽:)

Saturday, August 19, 2006

Blender 2006 google夏日代码建议(2)

体绘制的建议。Volumetric Rendering Proposal

IMPLEMENTING VOLUMETRIC RENDERING FOR BLENDER

在 blender 中实现体绘制的建议

Synopsis:

Volumetric rendering is the process of visualizing three dimensional data sets.I would like to implement slice-based rendering of volumes, defined by the volume function like "Fragment getFragment(x,y,z)" where "Fragment" is a data structure containing fields like red, green and blue color channels, alpha channel, normal vector, etc; x, y, z denotes a point in 3D space(local or global). Slice method approximates the volume by projecting volume function on sequential planes. Planes are camera-oriented, meaning their normals always points toward the camera. Slice technic is good for rendering volumes that describe cloud-like objects: explosions, nebulas, smoke. getFragment function allows high variation of possibilities including constructing specific shapes with boolean operations. For example, one cloud can "mask out" another cloud.

Blender currently has no volumetric rendering. Effects like explosions can be produced with particles, but when camera moves around, it is clearly visible that explosion is created from "parts" that behave unnaturally.

在自然环境和计算模型中,许多对象和现象只能用三维数据场表示,对象体不是用几何曲面和曲线表示的三维实体,而是以体素为基本造型单元。例如人体里面就十分复杂,如果仅仅用几何表示各器官的表面,不可能完整显示人体的内部信息。体绘制(Volume Rendering)的目的就在于提供一种基于体素的绘制技术,它有别于传统的基于面的绘制技术,能显示出对象体的丰富的内部细节。体绘制直接研究光线穿过三维体数据场时的变化,得到最终的绘制结果,所以体绘制也被称为直接体绘制。体绘制与传统面绘制的区别见图2-8。从结果图象质量上讲,体绘制优于面绘制,但从交互性能和算法效率上讲,至少在目前的硬件平台上,面绘制优于体绘制,这是因为面绘制是采用的传统的图形学绘制算法,现有的交互算法和图形硬件和图形加速技术能充分发挥作用。

Blender 现在的爆炸效果是用粒子来模拟的,在改变了摄象机位置以后,会感觉不太真实。

Deliverables:

New object type "Volume" will be implemented. This type will have position and dimensions. Also it will have parameters that adjust rendering quality, like quantity of slices, and possibly some other sampling parameters. New pass for sliced volumetric rendering will be implemented and seemlessly integrated. "getFragment(x,y,z)" will be implemented for 3D textures.

在blender当中实现一类“体”的物体类型。有位置和尺寸。当然也有渲染质量控制的参数。采样和3d的纹理的实现也可以无缝的衔接。

Implementation Details:

New blender's rendering process allows for easy integration of new rendering passes. renderVolume function will be implemented to write into RenderPart. Resulting part will be combined by blender's rendering engine.

实现细节:

需要新的渲染流程,和新的前置渲染引擎实现。

中文的关于体绘制的科普:http://www.cgn.net.cn/wsdj/z7.htm

Blender架构和数据结构问题

小小感想.

英文方面,这里已经将源文件中的注释提出专门列了一些题目.

http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture

虽然不完全,但是具备一定的代表性了.

blender作为一个cg软件,数据上面有些特殊性,ton在文章中已经明确指出,为了做到所见即所得,需要有3方面的结构准备:操作结构,显示数据结构,还有存储数据结构.之间有些关联, 通过用c语言,做到面向对象的程序. 例如一个mesh,mesh 和 editmesh 在structs dna的文件中被定义,在interface api中定义显示方式.关于这一点我们可以在 05年soc的nurbs项目中清晰的看到这个脉络.

http://mediawiki.blender.org/index.php/BlenderDev/NurbsCurvesNurbana

这个项目的前期工作其实已经完成,唯一没做的就是整合进bf-bledner.最近其实很希望看这部分代码.机器又出问题,恩恩,先cvs了这个项目再说.

最近在学erlang

据说是门函数性语言,类似的还有 Scheme、ML、Haskell. 主要就是想看看wings3d的内容,其实这些东西都能猜个八九了. 只是里面详细的算法还得深入.wings相对来说是比较简单的,它的点线的挤出是靠欧拉操作来完成的跟blender或者其他高级点的完全不同,blender能够挤出点,wings必须把点周围添加面和边才行.简单化了编程,自然也简单化了用户群. 混合编程以后会常态化,继续学习.
-----------------------------------------------------------------
估计得花点钞票把ml编程这本书请回家来.站在那本书前一直都有些困惑,该拿还是不拿,总在盘算机会成本.呵呵,学习耗费了很大成本,不知道这次的知识储备能够用多少个年头.

网上汇款免手续费, 收货满意后卖家才能拿钱,货款都安全