使用pbrt 1.03遇到的问题和解决方法
2008-06-17 21:01
447 查看
版本1.03,在http://www.pbrt.org/downloads.php下载,目前是最新的,使用起来遇到了如下问题,可能以后还会更多。
1. 编译flex,bison脚本。这一步的确很烦,我想很多人都是卡在这一步就过不去了。这里详细解释一下。readme和很多教程上讲在windows下编译pbrt第一步要装cygwin。实际上只用到了flex和bison两个程序,这两个程序原本是linux下的程序,cygwin将他们移植到windows平台。这两个程序是生成处理pbrt脚本的代码。pbrt规定了自己的场景描述规则(虽然很像renderman的rib文件,但有的地方还是不同)。程序为了能够解析这个场景描述文件,如果我们一般人写这部分程序,估计就if...else...一大堆逐行判断了,这样写起来扩展性差,代码难懂,编写和调式起来都很麻烦。
作者使用了高级的工具,即了flex词法分析和bison(或者叫yacc)语法分析。如果是计算机专业学习过《编译原理》并做过实验的话,我想应该知道这是什么东西。如果没学过,我想也没有必要搞清原理。总体来说就是就是写两个脚本文件pbrtlex.l和pbrtparse.y(见vs项目工程下core->Parse File),这两个文件是flex和bison自己的描述语言写成,它用来描述“场景描述规则”的。flex和bison通过这两个描述文件,直接生成pbrtlex.cpp,pbrtparse.cpp,pbrtparse.hpp这三个文件,他们就可以直接集成到系统中读取和分析pbrt场景描述文件了。所以如果没有装cygwin或者没有编译成功这三个文件,后面会报错说这三个文件找不到。对于大多数应用来说,没有必要修改场景描述规则,所以直接把这三个文件拿过来放到工程里用就行,我编译好了一个/Files/gaoyuear/parsed_files.rar,可以直接下载用。这样用的话就不用flex和bison编译了,右键单机pbrtlex.l和pbrtparse.y,选择属性,Configuration选择All Configurations,右面Excluded from build选择Yes就可以了。
如果自己编译的话,生成出来的pbrtlex.cpp文件中还有一个错误,第764行将#include <unistd.h>注释掉,第1907行替换为b->yy_is_interactive = 0;就可以了。附件中的文件我已经改过了。
最后写个题外话,听人说现在google的CEO Eric Schmidt大学时编程非常厉害,flex就是他编写的,linux下doc flex的最后还能看到他是主要贡献者之一。
2. windows下只能使用vs2005编译。一开始我不知道,用vs2008编译出来后,一运行就报错。后来网上找到作者说vs2008有问题,得重新编译一些第三方库文件,并且还有可能导致速度慢很多。所以一定不能用vs2008来编译pbrt。
3. LookAt bug。
pbrt使用的是左手坐标系,对于熟悉opengl的人来说很痛苦,并且LookAt函数还有个bug,使我为了搞清它的坐标系统花费了很长时间。
默认的左手世界坐标系是(假定面对显示器),向前为+z,向右是+x,向上是+y。相机默认位于原点,面向+z。
左手坐标系里的向量叉乘(Cross)满足左手法则。
Rotate的角度满足左手法则,和书上P72. Figure2.10的图不符(书上是右手法则)。
LookAt函数的bug, P76页, transform.cpp 109行,应该是
Vector dir = Normalize(look - pos);
Vector right = Normalize(Cross(up, dir));
Vector newUp = Cross(dir, right);
原文把后两个叉乘的向量写反了。
1. 编译flex,bison脚本。这一步的确很烦,我想很多人都是卡在这一步就过不去了。这里详细解释一下。readme和很多教程上讲在windows下编译pbrt第一步要装cygwin。实际上只用到了flex和bison两个程序,这两个程序原本是linux下的程序,cygwin将他们移植到windows平台。这两个程序是生成处理pbrt脚本的代码。pbrt规定了自己的场景描述规则(虽然很像renderman的rib文件,但有的地方还是不同)。程序为了能够解析这个场景描述文件,如果我们一般人写这部分程序,估计就if...else...一大堆逐行判断了,这样写起来扩展性差,代码难懂,编写和调式起来都很麻烦。
作者使用了高级的工具,即了flex词法分析和bison(或者叫yacc)语法分析。如果是计算机专业学习过《编译原理》并做过实验的话,我想应该知道这是什么东西。如果没学过,我想也没有必要搞清原理。总体来说就是就是写两个脚本文件pbrtlex.l和pbrtparse.y(见vs项目工程下core->Parse File),这两个文件是flex和bison自己的描述语言写成,它用来描述“场景描述规则”的。flex和bison通过这两个描述文件,直接生成pbrtlex.cpp,pbrtparse.cpp,pbrtparse.hpp这三个文件,他们就可以直接集成到系统中读取和分析pbrt场景描述文件了。所以如果没有装cygwin或者没有编译成功这三个文件,后面会报错说这三个文件找不到。对于大多数应用来说,没有必要修改场景描述规则,所以直接把这三个文件拿过来放到工程里用就行,我编译好了一个/Files/gaoyuear/parsed_files.rar,可以直接下载用。这样用的话就不用flex和bison编译了,右键单机pbrtlex.l和pbrtparse.y,选择属性,Configuration选择All Configurations,右面Excluded from build选择Yes就可以了。
如果自己编译的话,生成出来的pbrtlex.cpp文件中还有一个错误,第764行将#include <unistd.h>注释掉,第1907行替换为b->yy_is_interactive = 0;就可以了。附件中的文件我已经改过了。
最后写个题外话,听人说现在google的CEO Eric Schmidt大学时编程非常厉害,flex就是他编写的,linux下doc flex的最后还能看到他是主要贡献者之一。
2. windows下只能使用vs2005编译。一开始我不知道,用vs2008编译出来后,一运行就报错。后来网上找到作者说vs2008有问题,得重新编译一些第三方库文件,并且还有可能导致速度慢很多。所以一定不能用vs2008来编译pbrt。
3. LookAt bug。
pbrt使用的是左手坐标系,对于熟悉opengl的人来说很痛苦,并且LookAt函数还有个bug,使我为了搞清它的坐标系统花费了很长时间。
默认的左手世界坐标系是(假定面对显示器),向前为+z,向右是+x,向上是+y。相机默认位于原点,面向+z。
左手坐标系里的向量叉乘(Cross)满足左手法则。
Rotate的角度满足左手法则,和书上P72. Figure2.10的图不符(书上是右手法则)。
LookAt函数的bug, P76页, transform.cpp 109行,应该是
Vector dir = Normalize(look - pos);
Vector right = Normalize(Cross(up, dir));
Vector newUp = Cross(dir, right);
原文把后两个叉乘的向量写反了。
相关文章推荐
- 使用pbrt 1.03遇到的问题和解决方法
- KALI LINUX中使用wifiphisher遇到的一系列问题解决方法
- vue 2.0中使用axios遇到问题的解决方法
- 使用SourceSafe管理软件开发可能遇到的问题及解决方法
- 使用CentOS 遇到的问题以及解决方法(持续更新)
- 使用MFC过程中遇到的问题以及解决方法(三)
- ubuntu下git的使用流程,包括可能遇到的问题和解决方法。
- zabbix使用过程中遇到的问题与解决方法(3)
- Intellij 在使用过程中遇到的问题及解决方法
- Windows下安装Apache HTTP Server 无法启动遇到OS10048 通常每个套接字地址(协议/网络地址/端口)只允许使用一次 的问题解决方法
- 在SharePoint中服务器端使用Word编程模型转换PDF遇到的问题以及解决方法
- 使用WinDbg调试Silverlight中遇到“Failed to find runtime DLL (clr.dll), 0x80004005”问题的解决方法之一
- Laravel 使用遇到的问题及解决方法
- 使用Ubuntu遇到的问题以及解决方法(持续更新)
- FckEditor使用时遇到的两个问题,未能加载xxxx和上传图片无响应的解决方法
- erlang的dialyzer使用中遇到的问题,以及解决方法
- 在tp3.2.3中使用 FormData 对象实现表单的文件上传功能遇到的一个问题及解决方法
- mybatis使用过程遇到的一些问题及解决方法
- 使用eclipse编译qt程序遇到问题的解决方法