首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >圆柱形本原的UV偏导数

圆柱形本原的UV偏导数
EN

Computer Graphics用户
提问于 2020-07-11 14:11:35
回答 1查看 93关注 0票数 1

我是新的渲染和我想计算UV偏导数的圆柱形,这是参数化的半径R和长度L

使用柱面坐标映射,对于表面点\mathbf{p}=(x,y,z),UV地图(归一化为[0,1])是:

(u,v) = \Big(\frac{\phi}{2\pi}, \frac{z}{L}\Big)\qquad \text{where} \quad \phi = \arctan \frac{y}{x}

然后计算有关\mathbf{p}的导数,即:

\begin{aligned} \frac{\partial u}{\partial \mathbf{p}} & = \frac{1}{2\pi R^2} \Big( -y, x, 0\Big) = \frac{1}{2\pi R} \Big( -\sin\phi, \cos\phi, 0\Big)\\ \frac{\partial v}{\partial \mathbf{p}} &= \Big( 0, 0, \frac{1}{L}\Big) \end{aligned}

或相当于:

\begin{aligned} \frac{\partial \mathbf{p}}{\partial u} & = 2\pi R \Big( -\frac{1}{\sin\phi}, \frac{1}{\cos\phi}, 0\Big)\\ \frac{\partial \mathbf{p}}{\partial v} &= \Big( 0, 0, L\Big) \end{aligned}

到现在为止一切看起来都很好。

问题

pbrt-3中,cylinder.cpp的相关部分是:(i) UV与上面相同;(ii) \partial \mathbf{p}/\partial u是不同的:

代码语言:javascript
复制
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);

我在这里错过了什么?

EN

回答 1

Computer Graphics用户

回答已采纳

发布于 2020-07-11 19:11:52

我认为,通过编写从(u,v)\mathbf{p}的前向映射,获得切线框架是最简单的:

代码语言:javascript
复制
  `\mathbf{p}(u,v) = \begin{bmatrix} R \, \cos (2\pi u) \\ R \, \sin (2\pi u) \\ vL \end{bmatrix} #qcStackCode#`

然后你可以看到衍生产品是:

代码语言:javascript
复制
  `\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作为这样的坐标。然后我们得到了逆映射,

\begin{aligned} u(x,y) &= \frac{1}{2\pi} \arctan(y,x) \\ R(x,y) &= \sqrt{x^2 + y^2} \end{aligned}

他的雅可比是:

代码语言:javascript
复制
  `\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#`

与此相反的是:

代码语言:javascript
复制
  `\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获得的结果相匹配。

票数 2
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/10014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档