Pluecker coordinates普吕克坐标系介绍

本文介绍了普吕克坐标系的基本概念及其在三维空间中线的表示方式,详细阐述了其几何意义及代数表示方法,并探讨了在光线追踪等应用中的作用。

最近在看光场拼接的论文时,在拼接之前需要将两个光场进行配准(Registration),将光场转换到Pluecker坐标系下,这样做有两个好处:1.在Pluecker坐标系中描述光线,投影到均匀光场坐标中是一个线性映射 2. 3D场景中的点在4D光场中是一个二维的线性子空间,因此可以在第一和第二个光场中产生线性约束。将光场转换到Pluecker坐标系下的论文还有《On linear structure from motion for light field cameras》

在这里我就介绍一下普吕克坐标系
普吕克坐标是三维空间中有向线的表示,每一个3D有向线对应于6D普吕克空间中均匀点(换句话说,5D空间中的非均匀点)。我们需要这么多的维度是有意义的,因为3D点对定义线,但是我们可以降低一个维度,通过实现线的定义:(0,0,0)到(1,1,1)和(0,0,0)到(2,2,2)是相通的一根线,只是比例因子不同。
一丶集合直观表示
这里写图片描述
三维欧几里德空间中的线L由它包含的两个不同点或包含它的两个不同平面确定。 考虑第一种情况,点x =(x1,x2,x3)和y =(y1,y2,y3),从x到y的矢量位移是非零的,因为点是不同的,并且表示线的方向,也就是说,L上的点之间的每个位移是d = y-x的标量倍数,如果单位质量的物理粒子从x移动到y,它将有一个关于原点的矩,几何等价物是方向垂直于包含L和原点的平面的矢量,其长度等于由位移和原点形成的三角形的面积的两倍,将点作为从原点的位移处理,矩为m = x×y,其中“×”表示矢量交叉乘积。对于固定线L,三角形的面积与x和y之间的段的长度成比例,被认为是三角形的基础;通过沿着与平行于其自身的线滑动基座而不改变它。 根据定义,力矩矢量垂直于沿着线的每个位移,因此d•m = 0,其中“•”表示矢量点积。
尽管单独的d和m都不足以确定L,但是该对一起独特地执行,直到取决于x和y之间的距离的公共(非零)标量倍数。 就是坐标(d:m) = (d1:d2:d3:m1:m2:m3)可以认为是L的均匀坐标,在这个意义上,对于λ≠0的所有对(λd:λm)可以由L和L上的点产生,并且任何这样的对确定唯一的行,只要d不为零,d•m = 0。此外,这种方法延伸到在投影几何的意义上包括点,线和“无穷远”的平面。
例。 令x =(2,3,7)和y =(2,1,0)。 然后(d:m)=(0:-2:-7:-7:14:-4)。
或者,让含有L的两个不同平面的点x的等式
0 = a + a•x
0 = b + b•x
那么它们各自的平面垂直于向量a和b,并且L的方向必须垂直于两者。 因此,我们可以设置d = a×b,它是非零的,因为a和b既不为零也不平行(平面不同且相交)。 如果点x满足两个平面方程,则它也满足线性组合
0 = a (b + b•x) − b (a + a•x)
= (a b − b a)•x .
也就是说,m = a b - b a是垂直于从原点到L上的点的位移的矢量; 事实上,这是与a和b以前定义的d一致的矩。
例。 令a0 = 2,a =(-1,0,0)和b0 = -7,b =(0,7,-2)。 然后(d:m)=(0:-2:-7:-7:14:-4)。
虽然通常的代数定义倾向于模糊关系,(d:m)是L的Plücker坐标。

二丶代数表示
1)原始坐标
在三维投影空间P3中,让L成为具有均匀坐标(x0:x1:x2:x3)和(y0:y1:y2:y3)的不同点x和y的直线。 Plücker坐标pij定义如下:

这意味着pii = 0和pij = -pji,减少了只有六(4选择2)独立量的可能性。 六位六合
这里写图片描述由L唯一确定,达到常见的非零比例因子。 此外,并非所有六个组件都可以为零。 因此,如结肠符号所示,L的Plücker坐标可以被认为是5维投影空间中的点的均匀坐标。
为了看这些事实,让M是4×2矩阵,其中点坐标为列。
这里写图片描述
Plücker坐标pij是M的行i和j的行列式。由于x和y是不同点,M的列是线性独立的; M具有等级2.令M’是第二个矩阵,列x’和y’在L上是不同的一对不同点。然后M’的列是M的列的线性组合; 所以对于一些2×2非奇异矩阵Λ,
这里写图片描述
特别地,M’和M的行i和j相关
这里写图片描述
因此,左侧2×2矩阵的行列式等于右侧2×2矩阵的决定因子的乘积,后者是固定标量detΛ。 此外,由于M的等级为2,所以M中的所有六个2×2子确定不能为零。

2)Pluecker map(普吕克映射)
用G1,3表示P3中所有行(P1的线性图像)的集合。 因此我们有一张地图:
这里写图片描述
其中 这里写图片描述

3)双重坐标
或者,一条线可以描述为两个平面的交点。 令L分别包含具有均匀系数(a0:a1:a2:a3)和(b0:b1:b2:b3)的不同平面a和b的线。 (例如,第一平面方程为这里写图片描述)。双Plücker坐标pij为:这里写图片描述,双坐标在一些计算中是方便的,它们等同于主坐标:
这里写图片描述
这里,均匀坐标中的两个向量之间的相等意味着右侧的数字等于左侧的数字直到某些常用缩放因子λ{\ displaystyle \ lambda} \ lambda。 具体来说,令(i,j,k,l)为(0,1,2,3)的均匀置换; 然后
这里写图片描述

4)几何
为了与几何直觉相关,将x0 = 0作为无限远的平面; 因此不能在无穷远处的点的坐标可以被归一化,使得x0 = 1这里写图片描述
并设置x =(x1,x2,x3)和y =(y1,y2,y3),我们有d =(p01,p02,p03)和m =(p23,p31,p12)。

我们有d =(p23,p31,p12)和m =(p01,p02,p03)。

三丶普吕克坐标的使用
Plücker坐标允许在三维空间中的线几何问题的简明解决方案,特别是涉及射线的几何。这或许是光场转换到普吕克坐标的一个重要原因。
1)线之间的交叉
P3中的两条线是偏斜或共面的,在后一种情况下,它们在一个独特的点上是重合的或相交的。 如果pij和p’ij是两个n的Plücker坐标,则当d⋅m’+m⋅d’= 0时,它们是精确共面的,如
这里写图片描述
当线条偏斜时,结果的符号表示交叉感:如果右旋螺丝将L插入L’,则为正,否则为负。
二次Plücker关系本质上表示一条线与其自身共面。

2)线与线之间的连接
在两条线共面但不平行的情况下,它们的共面有方程式:
这里写图片描述
要处理不符合此限制的行,请参阅参考。

3)平面与线
给出一个平面方程
这里写图片描述
或更简洁地这里写图片描述; 并且给出一条不在其中的线与Plücker坐标(d:m),那么它们的交点是:
这里写图片描述
点坐标(x0:x1:x2:x3)也可以用Plücker坐标表示:
这里写图片描述

4)点与线
给出一个点(y0:y)和不包含它的行,它们的共面有方程
这里写图片描述
平面坐标(a0:a1:a2:a3)也可以用双Plücker坐标来表示:
这里写图片描述
5)光线追踪
线形几何被广泛用于光线跟踪应用,其中光线的几何和交点需要以3D计算。 Thouis Jones为Ray Tracing论坛编写的Pluecker Coordinates简介中介绍了一个实现。

<think>我们正在解决两个主要问题:1.如何将Cesium中的Rectangle坐标转换为2D坐标系2.实体在2D模式下无法显示的解决方案注意:用户提到了rectangle实体在2D模式下的显示问题,以及坐标转换。我们之前的回答已经提供了一些解决方案,但这里需要更针对性地解决rectangle实体的2D显示问题,并解释坐标转换。根据之前的回答,实体在2D模式下不显示的原因可能有:-高度参考问题(HeightReference)导致实体被地形遮挡(在2D模式下,地形被简化为平面,但高度参考可能会使实体高度为0而不可见)-没有设置绝对高度(height或extrudedHeight)导致实体位于地表以下-坐标转换问题(3D世界坐标到2D平面坐标的转换)对于Rectangle实体,它是由西、南、东、北四个边界定义的矩形区域。在2D模式下,我们需要确保这个矩形区域能够正确投影到2D平面。解决方案:1.为Rectangle设置明确的高度(height)和拉伸高度(extrudedHeight),使其在2D模式下具有高度信息。2.禁用高度参考(HeightReference.NONE),避免在2D模式下被错误地固定在地面。3.坐标转换:我们可以使用Cesium.SceneTransforms将WGS84坐标转换为2D屏幕坐标,但这通常用于点而非矩形。对于矩形,我们可以通过获取其四个角的屏幕坐标来确定在2D视图中的位置,但这通常不是必须的,因为Cesium在2D模式下会自动处理矩形的显示(只要设置正确)。但是,如果我们在2D模式下仍然看不到Rectangle,我们可以采取以下步骤:步骤1:确保在添加Rectangle时设置了高度步骤2:在2D模式下,调整相机位置以确保矩形在视野内步骤3:在切换2D模式时强制重绘代码示例:```javascript//创建Rectangle实体varrectangleEntity=viewer.entities.add({rectangle:{coordinates:Cesium.Rectangle.fromDegrees(west,south,east,north),height:0,//底面高度extrudedHeight:100,//顶面高度,设置为0以上才能形成立体(在2D中显示为矩形框)material:Cesium.Color.RED.withAlpha(0.5),outline:true,outlineColor:Cesium.Color.BLACK,heightReference:Cesium.HeightReference.NONE//禁用高度参考}});```注意:在2D模式下,即使是一个平面矩形,也需要设置高度(height)和拉伸高度(extrudedHeight)来形成一定的厚度(哪怕height=0,extrudedHeight=1,也可以形成一个很薄的矩形)。如果没有高度差,则只会显示一个点或者线(如果设置了outline)。因此,我们可以通过设置height和extrudedHeight来确保矩形在2D模式下可见。另外,我们也可以通过设置2D模式下的相机范围来确保矩形在视野内:```javascript//切换到2D模式viewer.scene.morphTo2D(0);//设置相机俯视整个矩形viewer.camera.setView({destination:Cesium.Rectangle.fromDegrees(west,south,east,north)});```如果矩形仍然不可见,我们可以使用SceneTransforms将矩形的四个角转换为2D坐标,并检查它们是否在屏幕范围内。但是,这通常用于点实体,对于矩形,我们可以尝试获取其边界矩形的中心点,然后转换到屏幕坐标:```javascript//获取矩形的中心点varrectangle=rectangleEntity.rectangle.coordinates.getValue(Cesium.JulianDate.now());varcenter=Cesium.Rectangle.center(rectangle);//转换中心点到屏幕坐标varcanvasPosition=Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,center);console.log(canvasPosition);//如果坐标在画布外,则调整相机```然后根据中心点调整相机位置。总结实体在2D模式下不显示的解决方案(针对Rectangle):1.设置明确的高度值(height和extrudedHeight)以形成立体。2.设置heightReference为NONE。3.确保矩形在2D相机视野内(通过设置相机视图到矩形的范围)。4.在模式切换时强制重绘(viewer.scene.requestRender())。5.如果矩形特别小,考虑调整2D模式下的相机缩放距离。此外,用户的问题还包括“将rectangle.coordinates转换为2D坐标系”。我们通常不会将整个矩形转换为2D坐标系,而是将矩形的顶点转换为屏幕坐标(2D像素坐标),这可以通过Cesium.SceneTransforms.wgs84ToWindowCoordinates实现(对每个角点)。示例:将矩形的四个角转换为屏幕坐标```javascript//假设rectangle是Cesium.Rectangle对象varpositions=[newCesium.Cartographic(rectangle.west,rectangle.south),newCesium.Cartographic(rectangle.east,rectangle.south),newCesium.Cartographic(rectangle.east,rectangle.north),newCesium.Cartographic(rectangle.west,rectangle.north)];//转换为世界坐标varcartesians=positions.map(pos=>Cesium.Cartesian3.fromRadians(pos.longitude,pos.latitude));//转换为屏幕坐标varscreenPositions=cartesians.map(cartesian=>Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,cartesian));```这样我们就得到了矩形四个角在屏幕上的2D坐标(屏幕左上角为原点)。最后,生成相关问题:</think> ### 在Cesium中解决Rectangle实体2D显示问题及坐标系转换方法 #### 一、Rectangle实体在2D模式下不显示的解决方案 1. **设置绝对高度值** ```javascript viewer.entities.add({ rectangle: { coordinates: Cesium.Rectangle.fromDegrees(-110.0, 40.0, -100.0, 50.0), height: 100, // 必须设置绝对高度 extrudedHeight: 1000, // 形成立体效果 material: Cesium.Color.BLUE.withAlpha(0.7), heightReference: Cesium.HeightReference.NONE // 禁用高度参考[^1] } }); ``` **原理**:2D模式使用平面坐标系,未设置高度时默认Z=0(地表以下)导致不可见[^1] 2. **禁用地形影响** ```javascript viewer.terrainProvider = new Cesium.EllipsoidTerrainProvider(); ``` 3. **强制2D模式重绘** ```javascript viewer.scene.morphTo2D(0.5).then(() => { viewer.scene.requestRender(); // 手动触发渲染 }); ``` 4. **检查相机视野范围** ```javascript viewer.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(-105, 45, 100000), orientation: { heading: Cesium.Math.toRadians(0), pitch: Cesium.Math.toRadians(-90) // 垂直俯视 } }); ``` #### 二、Rectangle坐标转2D坐标系的方法 1. **基本转换原理** Cesium中2D模式使用**Web Mercator投影**,转换公式: $$ \begin{cases} x = R \cdot (\lambda - \lambda_0) \\ y = R \cdot \ln[\tan(\frac{\pi}{4} + \frac{\phi}{2})] \end{cases} $$ 其中$R$为地球半径,$\lambda$经度,$\phi$纬度 2. **手动转换实现** ```javascript function convertRectangleTo2D(rectangle) { const southwest = Cesium.Cartographic.fromRadians( rectangle.west, rectangle.south ); const northeast = Cesium.Cartographic.fromRadians( rectangle.east, rectangle.north ); return { minX: (southwest.longitude / Math.PI + 1) * 0.5 * canvas.width, maxX: (northeast.longitude / Math.PI + 1) * 0.5 * canvas.width, minY: (1 - (southwest.latitude / (Math.PI/2) + 1)/2) * canvas.height, maxY: (1 - (northeast.latitude / (Math.PI/2) + 1)/2) * canvas.height }; } ``` 3. **使用SceneTransforms API(推荐)** ```javascript function getRectangle2DCoords(viewer, rectangle) { const corners = [ new Cesium.Cartographic(rectangle.west, rectangle.south), new Cesium.Cartographic(rectangle.east, rectangle.north) ]; return corners.map(cartographic => { const cartesian = Cesium.Cartesian3.fromRadians( cartographic.longitude, cartographic.latitude ); return Cesium.SceneTransforms.wgs84ToWindowCoordinates( viewer.scene, cartesian ); }); } ``` #### 三、验证步骤 1. **创建测试实体** ```javascript const testRect = viewer.entities.add({ rectangle: { coordinates: Cesium.Rectangle.fromDegrees(-74, 40, -73, 41), material: Cesium.Color.RED.withAlpha(0.5), height: 10, extrudedHeight: 100 } }); ``` 2. **检查2D坐标转换** ```javascript viewer.scene.preRender.addEventListener(() => { if (viewer.scene.mode === Cesium.SceneMode.SCENE2D) { const screenCoords = getRectangle2DCoords(viewer, testRect.rectangle.coordinates.getValue()); console.log("2D Screen Coordinates:", screenCoords); } }); ``` #### 四、特殊场景处理 1. **动态变化的Rectangle** ```javascript const dynamicRect = viewer.entities.add({ rectangle: { coordinates: new Cesium.CallbackProperty(() => { return Cesium.Rectangle.fromCartesianArray(positions); }, false), //...其他参数 } }); ``` 2. **跨日期变更线处理** ```javascript if (rectangle.east < rectangle.west) { rectangle.east += Cesium.Math.TWO_PI; } ``` #### 关键原理总结 在2D模式下,所有几何坐标遵循以下投影转换: $$ \begin{pmatrix} x_{\text{screen}} \\ y_{\text{screen}} \end{pmatrix} = \mathbf{T} \cdot \mathbf{M} \cdot \begin{pmatrix} \lambda \\ \phi \end{pmatrix} $$ 其中$\mathbf{T}$为视口变换矩阵,$\mathbf{M}$为墨卡托投影矩阵 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值