我是新的渲染和我想计算UV偏导数的圆柱形,这是参数化的半径R和长度L。
使用柱面坐标映射,对于表面点\mathbf{p}=(x,y,z),UV地图(归一化为[0,1])是:
然后计算有关\mathbf{p}的导数,即:
或相当于:
到现在为止一切看起来都很好。
在pbrt-3中,cylinder.cpp的相关部分是:(i) UV与上面相同;(ii) \partial \mathbf{p}/\partial u是不同的:
Float u = phi / phiMax;
Float v = (pHit.z - zMin) / (zMax - zMin);
// Compute cylinder \dpdu#qcStackCode# and \dpdv#qcStackCode#
Vector3f dpdu(-phiMax * pHit.y, phiMax * pHit.x, 0);
Vector3f dpdv(0, 0, zMax - zMin);我在这里错过了什么?
发布于 2020-07-11 19:11:52
我认为,通过编写从(u,v)到\mathbf{p}的前向映射,获得切线框架是最简单的:
`\mathbf{p}(u,v) = \begin{bmatrix} R \, \cos (2\pi u) \\ R \, \sin (2\pi u) \\ vL \end{bmatrix} #qcStackCode#`然后你可以看到衍生产品是:
`\frac{\partial\mathbf{p}}{\partial u} = \begin{bmatrix} -2\pi R \, \sin(2\pi u) \\ 2\pi R \, \cos(2\pi u) \\ 0\end{bmatrix} = \begin{bmatrix} -2\pi y \\ 2\pi x \\ 0\end{bmatrix}, \qquad \frac{\partial\mathbf{p}}{\partial v} = \begin{bmatrix} 0 \\ 0 \\ L \end{bmatrix} #qcStackCode#`与pbrt代码匹配。
我认为您的推导是错误的,因为假设\partial\mathbf{p}/\partial u是\partial u / \partial{\mathbf{p}}的组件倒数。这并不简单,因为后一个对象实际上是u的梯度,其中u现在被认为是定义在所有空间(不仅仅是圆柱上)的标量场。为了正确地反演这一点,我们确实需要在u平面上另一个垂直于xy的坐标,这样我们就有了一个局部可逆映射,然后我们就可以得到它的雅可比矩阵并反演它。我们可以使用半径R作为这样的坐标。然后我们得到了逆映射,
他的雅可比是:
`\frac{\partial(u,R)}{\partial(x,y)} = \begin{bmatrix} \tfrac{\partial u}{\partial x} & \tfrac{\partial u}{\partial y} \\ \tfrac{\partial R}{\partial x} & \tfrac{\partial R}{\partial y} \end{bmatrix} = \begin{bmatrix} -y/(2\pi R^2) & x/(2\pi R^2) \\ x/R & y/R \end{bmatrix} #qcStackCode#`与此相反的是:
`\frac{\partial(x,y)}{\partial(u,R)} = -2\pi R \begin{bmatrix} y/R & -x/(2\pi R^2) \\ -x/R & -y/(2\pi R^2) \end{bmatrix} = \begin{bmatrix} -2\pi y & x/R \\ 2\pi x & y/R \end{bmatrix} #qcStackCode#`然后,您可以从其中读取\partial{(x,y)}/\partial u作为第一列,这与上面为\partial\mathbf{p}/\partial u获得的结果相匹配。
https://computergraphics.stackexchange.com/questions/10014
复制相似问题