Forum Replies Created
-
AuthorPosts
-
问题二:不同库的矩阵存储方式
文档中提供的转换函数是没有问题的,读的时候是按行读的,然后传递给一个行优先的矩阵。可以打印一下转换前后的矩阵看看有没有错。但是在实现SH旋转过程中确实需要注意到math.js的行优先存储,在合适的地方进行转置操作。
第一个问题:R^{-1}
首先,文档中列举的第一个性质和推导本身并无关系,推导过程立足的其实是性质二。。。。
说清楚一些,就是我们任意选择的{n_i},其实可以看作是到环境贴图上的dir vector,然后旋转环境光就是对这些向量的旋转,也就是R(n_i)。然后把R(n_i)重新用SH拟合,这样得到的新的SH系数应该等于原来SH系数的一个线性变化,这个才是算法设计的立足点。(性质一讲的旋转其实是一种旋转操作,R在等式两边不是一样的意思),文档提供的算法设计是没有问题的。然后,你的推导过程说实话我没有怎么看懂。。。。比如第一句的应该是f(R^{-1}(x)),这里的“应该是”三个字感觉没有那么显然。。。。不过在这确实扫除了一个小坑,也有可能你的理解是对的,但是表述上没有讲的很详细很清楚。[Hint: 实时端天空盒的旋转矩阵和SH系数的旋转矩阵之间传递时确实要好好想一下。]
作业0是不计分的,主要作用是熟悉作业框架以及提交流程,所以截止日期放那么长。
后期可能会开放作业补交。如果错过了作业1提交,请继续关注论坛有关补交作业的消息我们会第一时间发布!
我们使用的poisson disk在生成过程上是在单位圆上一层一层的生成采样点,层宽是 1/ sampleNumber,同层采样点的theta之间差着一个固定的angleStep,整体是从一个点呈螺旋型往外生成采样点。从最后的生成点的分布来看,更像是一个二维高斯,中间要密一些,不是均匀的。在文档里有采样函数的可视化链接,可以看一下。
3/4我的理解是这样,生成的采样点一开始卡着圆环的外边生成, 3/4 是一个让采样点回归到圆环内的缩放系数,换成别的也行。
提高采样数至200或更高,对比均匀采样和possion圆盘的差别,应该会有有趣的结果。
你好,作业0目前还没有公布。请继续保持关注BBS和课程进度,有关课程的重要信息和作业相关我们会第一时间发布置顶帖子通知;)
有关环境配置会在作业0文档中有非常详尽的描述,作业框架基于WebGL开发,因此开发环境的配置不会成为棘手问题!
好久没学物理,脑袋废了;但可以把节点设置成两个跑一下,应该能看出直接对力修正是没有办法影响摆动高度的,应该是这个框架不是严格的物理仿真?或者是我写法有问题。。。
学到了,学到了。不过阻尼的话我也在springs里计算过,现在想想在springs里计算然后算到合力里,其实就相当于变相改变弹力了;在masses里计算阻尼再去改变合力,跑回来一圈感觉又是变相的改变重力,会继续参加到下一步的速度计算(整个系统感觉没有损耗,所以能一直动)
如果直接对速度打折的话,相当于阻尼作用结果的直接使用,就能从系统中不断损耗能量- This reply was modified 4 years, 7 months ago by JZZ.
计算阻尼力的话,感觉在springs循环合适吧。因为要用弹簧两端的质点计算相对速度,但题目提示在masses遍历里加一个global的阻尼。。。就不知道怎么理解了。话说大大Vertel方法怎么实现呐,加速度取gravity的话绳子就从一端落下去了,或者是我springs里的长度约束没写对?
- This reply was modified 4 years, 7 months ago by JZZ.
我在半隐式欧拉的Add global damping位置加了一句:
m->velocity = (1 – 0.00005)*m->velocity;
就可以停下来了。因为感觉阻尼的存在就是和速度对抗,让速度降下来(不过老师讲要根据弹簧两个端点的相对速度计算,这么做感觉有点偷懒了。。。真是迷)
显示欧拉,因为一开始速度是NULL,就在Mass的构造函数给velocity设了初值(0,0)(顺手把last_position也给了(0,0)的初值)然后使用这一帧的速度计算当前位置,结果绳子直接起飞了。。。。。真是不知道怎么写才对了。。。。
verlet可以用当前质点位置的前一帧、后一帧的二阶泰勒展开解出来,不过里面带了一个加速度项;那求加速度不是又得在物理上分析受力了吗?感觉没有啥思路实现。。。。
感觉这次实验写的好迷啊,哪都不清楚,求点拨This post has received 1 vote up.应该没问题吧。话说masses、springs容器里存的是Mass、Spring指针,直接push怕是不太对的说
最长轴为X,只能说是一开始的大包围盒是这样的。左右子节点递归调用的时候就不能保证最长轴还是X轴了。源代码BVH建树的时候就是一开始先计算最长轴,然后用switch选择在最长轴投影质心。所以你构建出的分割还不是最优
打错了。。。是透明校正插值,睡迷糊了。。。
这个是顶点属性的Perspective correct interpolation(透明校正投影?),因为投影前后只保留线性关系不保留比例关系,直接插值得到的结果往往是不正确的(因为如果直接插值的话使用的是投影后的比例去插值投影前的属性;P.S. 11节课时,闫老师提到贝塞尔曲线在投影时不能像仿射变换那样简单处理感觉也和插值的这种性质有关)。真正解决顶点属性在三角形内部的取值使用的就是这种方法,你可以百度看看这种方法,推导过程有一些繁琐但思路很简单。。。
感觉可能是颜色那些顶点属性插值的问题,就是你的interpolate()这个函数可能写的有问题;另外三角形的坐标存的是float,用int保存最大值的话可能会有舍入问题(导致你的结果图上有人眼可见的非常明显的boundingbox痕迹,就是一块块的矩形区域),最大值上最好再加个1应该会改善一些
模型渲染的结果大小和设置的摄像头位置有关,可以修改main()中的变量eye_pos进行设置。
比如说那可以把eye_pos改成(0,0,1)再渲染一下bunny.obj试试黑边不是混叠是覆盖。。。。渲染过程是分离的,物体是一个一个渲染。先可以理解为渲染近的物体,再渲染远的物体(实际上这是一个比较随机的过程)。黑边的位置是前三角形的边缘,假设这个边缘有一半采样点在前三角内,一半在前三角外,那这个边缘pixel就采样了前三角的边缘梯度颜色。。。。随后开始渲染较远的三角形,在前三角重叠位置的边缘pixel,对后三角来说,有一半是能通过深度检测的(不被前三角遮挡)并且在后三角内(取后三角的颜色),另一半是被前三角遮挡不通过深度检测的(取背景黑色),这样又在这个边缘pixel获得了一个新的颜色值(这个值应该等于后三角的边缘梯度颜色)。。。。可以用吸管吸出看看两个值的确是相等的。。“黑边”是渲染后三角时用后三角的边缘颜色覆盖了实际上是前三角的一条边缘,只不过这两个浅纯色三角形之中视觉上看着更深而已。对pixel使用depth-buffer的话可以保证“黑边”位置不会被重复着色,而且逻辑上黑边位置就应该是前三角AA后的边缘梯度颜色,,,我之前在一篇帖子下回过一遍了,我觉得这种解释比较能讲通。话说着色是通过frame-buffer数组里存值的更新实现的,除非采样点是从frame-buffer里拿出颜色,否则默认不处理(取背景色黑)的话物体之间颜色是没有干扰混叠的
我刚尝试了一下我的sample_list还真没起作用。。。不过重叠部分的确是上层三角的边缘,理论上通过depth—buffer决定着色就可以了。2*2采样的时候需要计算保留采样点深度感觉是可以进行颜色、材质等顶点属性插值,不过我们这里是纯色三角形求均值得到颜色,这样看感觉sample—list好像就没那么有用了,,,,,,还是让助教老师解答吧,我也迷了ORZ
2*2采样部分只是为了计算像素的color属性,原来判断pixel是不是在三角形内部以及深度检测的部分还是要保留的;如果不做整个pixel的深度检测判断是否要shading的话,假设边界取样点一半在三角形内一半在三角形外,那么绘制前三角的时候会得到一个边界梯度颜色,绘制后三角的时候也会得到一个后三角的边界梯度颜色;所以这个黑线其实不是纯黑色,它应该是后三角的边界梯度颜色覆盖了前三角的。你可以用ps打开看看,它们RGB的值都是(46,54,60),只不过这条边界夹在两个浅色系中间在视觉上就显的更黑了。加上pixel Z-Buffer test之后保证那条边界是相对浅一点的前三角的取样颜色,在视觉上会好看一点
子采样点是不需要着色的,子采样点的作用就是给pixel均值计算color属性用的
可能是没有维护depth_Buffer,渲染的时候先渲染近的,再渲染远的object;导致远的物体覆盖在近的物体之上,最终结果和逻辑就相反了(不过实际上渲染器渲染第一个物体好像是随机的)
This post has received 1 vote up. -
AuthorPosts