射影几何笔记6:齐次坐标下“点-线”几何关系
一、两条直线的关系
假定存在两条直线:L1:和 L2: ;他们的关系,两条线的方程是:
1)两线相交于有界区域交点坐标是
这是一个普通的其次坐标。
此时,和无普通点相交;能满足方程,然而是无穷远点,并非普通点。
注意:事实上,任意直线 上的无穷远点,总是点,这可以立刻给出!
3)直线倾斜角对直线 来说,其倾斜角是:
二、总结
- (1) 拓广平面上点可以用齐次坐标( x1 , x2 , x3 )表示,成比例 的齐次坐标表示同一点, x1 , x2 , x3 不全为 0.当 x3 ≠0 时, ( x1 , x2 , x3 )表示普通点;当 x3 = 0 时表示无穷远点.
- (2) 拓广平面上直线也可用齐次坐标(ξ1 ,ξ2 ,ξ3 )表示,ξ1 ,ξ2 不全为零时是拓广直线;ξ1 = ξ2 = 0,而 ξ3 ≠0,表示无穷远直线.
- (3) 过两个不同点 A( a1 , a2 , a3 ), B ( b1 , b2 , b3 )的直线 ξ的 齐次坐标是
- (4) 两直线 ξ(ξ1 ,ξ2 ,ξ3 ),η(η1 ,η2 ,η3 )的交点 A 的齐次坐 标是
上面(3)与(4)的证明很容易.例如,点 A 与 B 都满足ξ的方 程 a2 a3 b2 b3 x1 + a3 a1 b3 b1 x2 + a1 a2 b1 b2 x3 = 0, 因此它是过 A, B 的直线方程. 可以证明.如果 a1 a2 b1 b2 = 0,
三、齐次函数性质
齐次坐标不是由一个点唯一确定的,因此在坐标上定义的函数,例如 f(x, y, z),不会像笛卡尔坐标那样确定在点上定义的函数。
但是,如果函数是齐次的,则在坐标上定义的条件 f(x, y, z) = 0(可用于描述曲线)确定了点上的条件。
具体来说,假设有一个 k 使得
如果一组坐标表示与 (x, y, z) 相同的点,那么对于某个非零值 λ,它可以写成 (λx, λy, λz)。
齐次坐标在计算机图形学中无处不在,因为它们允许将常见的向量 *** 作(例如平移、旋转、缩放和透视投影)表示为与向量相乘的矩阵。
通过链式法则,任何此类 *** 作序列都可以乘以单个矩阵,从而实现简单高效的处理。
相比之下,使用笛卡尔坐标,平移和透视投影不能表示为矩阵乘法,尽管其他 *** 作可以。
现代 OpenGL 和 Direct3D 图形卡利用齐次坐标来使用具有 4 元素寄存器的矢量处理器有效地实现顶点着色器。
[19][20]
例如,在透视投影中,空间中的位置与从它到称为投影中心的固定点的线相关联。
然后通过找到该平面与直线的交点将该点映射到该平面。
这可以准确表示 3D 对象在眼睛中的显示方式。
在最简单的情况下,投影中心是原点,点映射到平面 z = 1,暂时在笛卡尔坐标中工作。
对于空间中的给定点 (x, y, z),线和平面相交的点是 (x/z, y/z, 1)。
删除现在多余的 z 坐标,变成 (x/z, y/z)。
在齐次坐标中,点(x,y,z)用(xw,yw,zw,w)表示,它映射到平面上的点用(xw,yw,zw)表示,所以投影可以表示以矩阵形式为。
四、有关python代码
#yeah suppose I've done that.
import bpy
from mathutils import Matrix
from math import radians
ob = bpy.context.object
m = Matrix( ([1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 1],
[0, 0, 0, 0] ) )
m.transpose()
R = Matrix.Rotation(radians(30), 4, 'X')
#m = R @ m
for vert in ob.data.vertices:
v = m @ vert.co.to_4d() # sets vert.co.w to 1
'''
# vert.co.w is set to vert.co.z
v = vert.co.to_4d()
v.w = v.z
v = m @ v
'''
vert.co = 1 / v.w * v.to_3d()
参考文章:
https://en.wikipedia.org/wiki/Transformation_matrix#Perspective_projection
transforms - Can you work with homogeneous coordinates in the Python API? - Blender Stack Exchange
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)