WebGL介绍

发布在 图形学, WebGL

WebGL概述

什么是WebGL?WebGL简单的说就是在Web中渲染OpenGL的技术,也可以理解为把OpenGL的接口移植到浏览器中使用。具体的可以参考WebGL的维基百科
使用WebGL可以通过编写网页代码在浏览器中渲染三维图像,而且不需要任何的插件,比如Adobe Flash Player等。
WebGL在最新的浏览器中得到了广泛支持。

阅读全文

这是我的毕业论文题目,两年前的东西了,来出来纪念下吧。后面附演讲pdf。

这讲的是在一个三维模型上手绘纹理的故事,纹理是用户选择的样本纹理。因此,实际上我的毕业论文就是做了一个上纹理的工具。用户选择不同的模型,同时选择不同的样本纹理(符合马尔科夫随机场的样本纹理),就可以用鼠标在模型上刷三维纹理了。

阅读全文

数值到颜色的自然映射

发布在 图形学, OpenGL

很久没更新博客了。额,一直想写这个来着。记得以前写过绘制三维标量场的文章,方法是找的渐变颜色纹理图片,然后用一维纹理坐标映射贴上去的。后面发现根本不需要去找图片,这种渐变色本来就是一种颜色空间的定义。请看hsv颜色模型,这种颜色模型类似于rgb,也是三个分量h(色调),s(饱和度),v(亮度)。h表示的绕圆锥的一周,也就是纯颜色的渐变,正是我们需要的东西。s表示从圆心到圆边缘的半径,0-1的范围,表示颜色纯度。v则是垂直的轴,表示亮度。如下图,我们要的就是绕圈一周的颜色渐变。

阅读全文

我终于把界面换成qt的了,即使我从大二开始就用mfc,一直用到去年上半年。也终于到了,我实在受不了mfc代码混乱的时候了,qt那么方便的东西,我为什么不早点用了。这里就不吐槽mfc的混乱,qt的方便了。在mfc里面建立一个复杂的界面,比如说有dock窗口,或者tab页面的,代码多,而且混乱麻烦,更无语的是,每次我都必须去搜索下,解决各种各样的问题,有的还可以理解,有的就是莫名其妙了。更别说什么代码清晰,跨平台之类的,何止是天方夜谭。

下面,说说我自己逐渐搭建的这个框架吧。其实,这个框架是从我上一个项目里,使用mfc的单文档单视图,主窗口里面有几个dockpane,视图里面放置了渲染OpenGL的子窗口,过渡来的。在qt的框架里面,mfc所有的这些恶心的东西都没有了,只剩下一个MainWindow类。在这个类里面,创建菜单,工具条,状态条,主窗口,dock窗口,tab窗口。代码简洁方便。渲染opengl的窗口设置为MainWindow的主widget。渲染窗口只是一个普通的widget而已,可以任意放置。

阅读全文

提取三维表面标量场的等值线

发布在 图形学

上一篇文章说了提取拉普拉斯矩阵的第二个(或者其它)特征向量能得到一个有规律分布的标量场。现在讲的是如何在这样一个规律分布的标量场上提取出等值线。注意,这是在一个三角网格上面提取等值线,并不是真正的曲面。提取出等值线后,可以做一些相关的应用。

那么,如何提取等值线了?

阅读全文

一个三维模型,可以看做是一个无向图。顶点是图的点,边可以作为图的边,那么可以得到一个邻接矩阵,该矩阵叫做拉普拉斯矩阵,计算这个邻接矩阵的特征向量就是所谓的谱分析。

那么问题来了。如何定义边的权重?额,当然有不同的方法,看你需要分析的特性是什么。一般来说是边的两个对角的cotangle之和。另外,矩阵对角线元素是该行其它元素之和再取负。下一步就是计算该矩阵的特征向量了。如果计算了?我前面写过两篇文章讲述如何使用MATLAB计算稀疏矩阵的特征向量,现在我就是这么做的。首先,拉普拉斯矩阵是一个对称矩阵,而且是一个大型的稀疏矩阵。因此,只能使用稀疏矩阵来存储数据了。而且对称矩阵能保证一些特殊的性质,比如第一个特征向量是k * (1,1,1,1…)。第二个特征向量分布得比较有规律,但是通过实验发现,也许第二个也没有规律,可能是第三或者第四个,因为要利用特征向量的分布,需要综合多个特征向量。

阅读全文

使用CGAL计算SDF分割模型

发布在 图形学, CGAL

最新版的cgal4.5,提供了个Triangulated Surface Mesh Segmentation包,利用该部分代码可以计算三维模型每个面或者顶点的sdf(Shape Diameter Function)属性。sdf的具体定义可以参考论文:L. Shapira, A. Shamir, and D. Cohen-Or. Consistent mesh partitioning and skeletonisation using the shape diameter function. The Visual Computer, 24(4):249–259, 2008.

那么sdf可以做什么了?sdf最终能表示三维模型上面的一个标量场,该标量场代表的是模型厚度的分布。因此,利用该标量场可以对模型进行分割,不管是自动化的还是交互的都可以。如何计算sdf了?可以利用定义自己去实现算法,或者利用库,比如cgal。

阅读全文

这里统一考虑二维直线和三维平面的情况。
假设法线(二维直线和三维平面的法线)为n,其上的任意一点为p0。那么,
可以得到方程为:(p - p0) * n = 0。展开得到p * n = p0 * n。令p0 * n = d,由此可以得到
方程可以简单的表示为p * n = d,即(x, y, z) * (nx ,ny, nz) = d,二维情况直线的为(x, y) * (nx, ny) = d。
至此,我们可以方便的用(n,d)代表任意的二维直线或者三维平面了。
下面,开始应用这个表示。
比如,求点到直线或者平面的距离,然后求投影点,再求对称点。
最关键的是如何方便求出距离。假设我们要求q到直线的距离。我们现在的直线方程为
p * n = d。那么经过q与当前直线的平行直线的法线也为n。由于q在经过q的平行直线上面,有q * n = d’。
有符号距离为 d - d’ = d - q * n。通过这个式子,也可以知道d其实就是原点到直线或者平面的有符号距离。
那么投影点q’ = q + (d - d’) = q + (d - q * n)。
对称点则为 q’’ = q’ + (d - d’) = q + 2 * (d - q * n)。
利用这种表示方法,基本上可以直接给出答案。


阅读全文

说实话,立即模式用了一年多了,还是犯了这个错误。因为很多代码例子里面都是先指定法线,再指定位置,结果添加纹理坐标的时候就变成了指定纹理坐标在最后。
错误的写法:

1
2
3
glNormal3f(n.x(), n.y(), n.z());
glVertex3f(p.x(), p.y(), p.z());
glTexCoord1f(g_p_DisFromFile->norm_dis[g_denoted_point_id][he->vertex()->tag()]);
阅读全文
作者的图片

远行

孤筏重洋


游戏开发


Guang Zhou