实用的空间几何方法
实用的空间几何方法
设点表示为 P (x,y,z),直线表示为过点P (x,y,z) 和方向direction (x,y,z),平面表示为过点P (x,y,z) 和法线方向norm (x,y,z)。
代数符号 * 表示向量点积,
1 向量法求直线和平面交点
过点P和方向为L的直线,与过点Q和法线方向为N的平面的交点M。
过P点的直线在平面法向上的投影都相等,因此可以得到:
已知P、Q两点坐标,向量PQ可以求到。另外知道直线PM方向向量L,则M点可表示为:
代入上式可得:
2 向量法求两平面交线
过点P和法线方向为M的平面,与过点Q和法线方向为N的平面的交线,设交线过点L,方向向量为A。
首先可以通过平面法向量M、N求得直线方向向量:
然后通过A和法向量M可以求到直线PL的方向向量:
于是问题转变为求直线PL和过点Q和法线方向为N的平面的交点。如第一章所述,可以求得:
3 向量法求两直线交点
过点P和方向为A的直线,与过点Q和方向为B的直线的交点设为M。
已知:
代入化简可得:
4 向量法求三角形外接圆
已知点A、B、C围成的三角形,求三角形的外接圆圆心O。
因为:
得到:
5 根据TrackBall求旋转矩阵
如图所示,屏幕上有一个半球,因为鼠标为屏幕坐标系,想要通过鼠标实现对三维世界物体的旋转,可以参考trackball的方式获取到。
auto calScreenZ=[](float r, float x,float y){ float d,t,z; d=sqrt(x*x+y*y); //Inside sphere if(d<r*0.707) { z=sqrt(r*r-d*d); } //On hyperbola else { t=r/1.41421; z=t*t/d; } return z; }; ///获取归一化屏幕坐标 osg::Vec3 p1={2.0*(x1-xmin)/(xmax-xmin)-1.0,2.0*(y1-ymin)/(ymax-ymin)-1.0}; osg::Vec3 p2={2.0*(x2-xmin)/(xmax-xmin)-1.0,2.0*(y2-ymin)/(ymax-ymin)-1.0}; p1.z()=calScreenZ(_trackballSize,p1.x(),p1.y()); p2.z()=calScreenZ(_trackballSize,p2.x(),p2.y()); ///获取相机旋转矩阵 auto viewMat=getCameraViewMat().getRotate(); p1=p1*osg::Matrix::inverse(viewMat); p2=p2*osg::Matrix::inverse(viewMat); ///计算旋转矩阵 osg::Quat localQuat; localQuat.makeRotate(p2,p1);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具