当前位置: 首页 > wzjs >正文

网站开发语言有哪些wordpress标签code

网站开发语言有哪些,wordpress标签code,wordpress pc 手机,做采集网站操作相机在场景中进行旋转时,显示旋转中心标识显得更直观,怎么样添加旋转中心标识呢?一起来探究~ 原文:添加旋转中心标识(使用OpenGLQT开发三维CAD) 视频效果:见原文 11.添加旋转中心标识 旋…

操作相机在场景中进行旋转时,显示旋转中心标识显得更直观,怎么样添加旋转中心标识呢?一起来探究~ 

图片

原文:添加旋转中心标识(使用OpenGL+QT开发三维CAD)

视频效果:见原文

11.添加旋转中心标识

旋转是三维软件的基础交互功能,常常需要显示旋转中心标识以方便观察当前旋转中心位置。如当选中构件时旋转常常期望以构件(接触点或几何中心等)为中心进行旋转;无聚焦点时旋转又常常以场景中心为旋转中心。

提示:

作者在《视频课程》中对ViewCube绘制和工作有详细的讲解,欢迎观看支持。

https://www.bilibili.com/cheese/play/ss168681371

学习!《从零开发一款三维CAD软件(OpenGL/QT/C++)》课程上线啦

11.1.概述

基于如下考虑,我们采用此前绘制viewCube的思路来绘制旋转中心,还能想起来吗?

  1. 构建原点为中心的数据;

  2. 个性化构建viewMatrix,如以固定的正视视角和距离观察旋转中心标识;

  3. 在经过projectionMatrix投影后(此时得到了标准化设备坐标)立即进行偏移:通过目标像素位置计算偏移距离,偏移到标准化设备坐标范围中对应位置;

  4. (默认处理)此后通过视口变换映射到屏幕上的像素位置,旋转中心标识正确显示到了对应像素位置。

我们可能会有疑问,怎么样得到目标像素位置,怎么样计算偏移距离?带着疑问,我们继续学习。

考虑因素:

  • 为保持更高的渲染效率,继续采用基于VAO、VBO、EBO的数据桥梁机制,先配置好数据,而后在渲染循环中绘制;

  • 考虑可维护性和扩展性,采用相同的机制绘制场景元素,如viewCubemouseRotateLabel等;

11.2.添加世界坐标和屏幕坐标转换函数

在此前的相机实现中,我们通过监控鼠标左键按住移动事件实现了场景旋转,其中我们判断了第一次按下时鼠标所在位置是否接触有效元素,并计算并记录接触位置的场景坐标赋值给mousePos4Rotate

提示:

上述使用了场景坐标的名词,指的是当前Viewer场景中的坐标,即通过y-up转为GLViewer采用的z-up规则后的坐标。

我们发现Camera类中的Screen2WorldWorld2Screen函数名不太准确,那就行动吧,分别更改为Screen2SceneScene2Screen。同时GetWorldPos函数实现有点问题,且并没有被使用,我们先注释它。

上述mousePos4Rotate是场景坐标,我们可以将其变换到屏幕坐标(像素位置),然后再进一步根据逆向的视口变换过程得到在标准化设备坐标范围中的偏移。

void ViewerUtils::worldToScreen(const QVector3D& wcsPt, const QRect& viewport_rect, bool considerModelTrans, const QMatrix4x4& modelMat, const QMatrix4x4& viewMat, const QMatrix4x4& projectionMat, float& px, float& py, double& depth)
{
QVector4D ray_eye(wcsPt, 1.0);
if (considerModelTrans)ray_eye = modelMat * ray_eye;ray_eye = projectionMat * viewMat * ray_eye;depth = ray_eye.z() / ray_eye.w();px = (ray_eye.x() / ray_eye.w() + 1.f) / 2.f * viewport_rect.width();py = (ray_eye.y() / ray_eye.w() - 1.0) / -2.f * viewport_rect.height();
}

注意上述参数bool considerModelTrans,如果设为false则是将场景坐标转换为屏幕坐标,否则将世界坐标转换为屏幕坐标

另外,我们也定义了screenToWord函数,详见工程代码~

11.3.配置数据

我们参考viewCube数据的配置过程配置旋转中心标识数据,我们需要一个中心在原点的矩形面结合标识图片作为纹理来表达。

void Model::setupMouse()
{Vector3f pt0{ -2.f, -2.0f, 0.0f };Vector3f pt1{ 2.f, -2.0f, 0.0f };Vector3f pt2{ 2.0f, 2.f, 0.0f };Vector3f pt3{ -2.0f, 2.f, 0.0f };Vector3f nor0{ 0.0f, 0.0f, 1.0f };Vector3f nor1{ 0.0f, 0.0f, 1.0f };Vector3f nor2{ 0.0f, 0.0f, 1.0f };Vector3f nor3{ 0.0f, 0.0f, 1.0f };Face face;face.outerLoop.lstLine.push_back(Line{ pt0, pt1 });face.outerLoop.lstLine.push_back(Line{ pt1, pt2 });face.outerLoop.lstLine.push_back(Line{ pt2, pt3 });face.outerLoop.lstLine.push_back(Line{ pt3, pt0 });TriangleMesh cMesh;CGUtils::TesslateFace(face, cMesh);vector<Vector2f> lstUvs;lstUvs.push_back(Vector2f(0.0, 0.0));lstUvs.push_back(Vector2f(1.0, 0.0));lstUvs.push_back(Vector2f(1.0, 1.0));lstUvs.push_back(Vector2f(0.0, 1.0));cMesh.SetUVs(lstUvs.size(), &lstUvs[0].U);auto mesh = ConvertMesh(cMesh);mapName2VMesh.insert(make_pair(ViewerCache::mouseLabel, MeshInfo(mesh, Vector3W(1.0f, 1.0f, 1.0f, 1.0f))));
}

像此前的处理一样,我们把配置好的mesh添加到mapName2VMesh中,便于之后在渲染循环中进行绘制。

记得把纹理图片添加到glviewer.qrc中哦,否则项目识别不到资源; 你也可以使用自己的图片创造不一样的效果。

鼠标旋转中心标识图标
图:鼠标旋转中心标识图标

 

嘿嘿,上面的标识图片使用了CGLib库的计算紧密外围轮廓的函数并将紧密外轮廓绘制到了图片上(亮显的外轮廓)。

11.4.绘制函数

由于这些场景元素的绘制过程是大致一样的,我们进行抽象和重构,

void Model::DrawViewElement(QOpenGLShaderProgram& shader, conststring& name)
{
auto itrFind = mapName2VMesh.find(name);
if (itrFind == mapName2VMesh.end())
return;auto& viewCube = itrFind->second;string imagePath = "";
if (name == ViewerCache::viewCube)imagePath = ":/viewcube.png";
elseif (name == ViewerCache::mouseLabel)imagePath = ":/rotateLabel.png";
else
throw exception("can not get valid image path.");auto textTexture = ViewerUtils::getOrCreateImageTexture(imagePath.c_str());textTexture->bind(0);shader.setUniformValue("texture_diffuse1", 0);//  viewCubeshader.setUniformValue("objectColor", viewCube.color.GetWX(), viewCube.color.GetWY(), viewCube.color.GetWZ(), viewCube.color.GetW());viewCube.current->Draw(shader);textTexture->release();
}

后续其他场景元素也可采用类似的机制和过程,如鼠标捕捉标识坐标系标识等。

11.5.在渲染循环中调用绘制

通过此前课程我们知道OpenGL是一个状态机,其中的渲染管线也是,参考杉树viewCube的配置过程,我们需要对渲染管线的几个关键环节进行状态配置

  1. 通过固定的正视视角和距离构造观察矩阵GetViewMatrix4MouseLabel

  2. 将场景坐标mousePos4Rotate转换为屏幕坐标mousePXmousePY

  3. 经过逆向视口变换将屏幕坐标映射为标准化设备坐标范围的位置(也即偏移,因为旋转中心标识数据在其原点位置),在投影后立即进行此偏移;

  4. 注意此处点光源位置设置为视角方向,目的是让旋转中心标识拥有明亮的显示效果,毕竟是便于观察嘛;

提示:

  • 尽量使场景元素的深度值小(通过缩小元素尺寸+将观察点设置很近),便于一直绘制,且不被遮挡;试想一下,场景元素距离透视平截头体的近平面很近,深度值自然就很小;

  • 当然也可以在片段着色器中更改场景元素的深度来达到同样目的,那样修改会更多些。

//  mouse
float mousePX, mousePY;
double mouseDepth;
ViewerUtils::worldToScreen(m_camera.mousePos4Rotate, { 0, 0, m_camera.SCR_WIDTH, m_camera.SCR_HEIGHT }, false, m_modelMatrix, m_viewMat, m_projectionMat, mousePX, mousePY, mouseDepth);
float pt_x = ((float)mousePX / m_camera.SCR_WIDTH) * 2.f - 1.f;
float pt_y = -((float)mousePY / m_camera.SCR_HEIGHT) * 2.f + 1.f;
QMatrix4x4 offMouseLabel;
offMouseLabel.translate(QVector3D(pt_x, pt_y, 0.0));m_projection4ViewCube.setToIdentity();
m_projection4ViewCube.perspective(45.0f, (float)m_camera.SCR_WIDTH / (float)m_camera.SCR_HEIGHT, 0.1f, 100.0f);QMatrix4x4 modelMouse;
modelMouse.translate(m_camera.mousePos4Rotate);
m_textureShader.setUniformValue("lightColor", QVector3D(1.0f, 1.0f, 1.0f));
m_textureShader.setUniformValue("lightPos", QVector3D(0.f, 1.f, 0.f));
m_textureShader.setUniformValue("projection", offMouseLabel * m_projection4ViewCube);
m_textureShader.setUniformValue("view", m_camera.GetViewMatrix4MouseLabel());
m_textureShader.setUniformValue("model", m_modelMatrix);
m_model->DrawViewElement(m_textureShader, ViewerCache::mouseLabel);

11.6.效果

如果一切正常,或者遇到的问题被排查解决,那么运行后可以看到如下效果。

鼠标旋转中心标识效果
图:鼠标旋转中心标识效果

效果视频:https://www.bilibili.com/cheese/play/ss168681371

也可在《课程视频》中进行观看,有详细的讲解~

学习!《从零开发一款三维CAD软件(OpenGL/QT/C++)》课程上线啦


专注于图形学(渲染和几何算法)、数据处理、并行计算相关研究和研发,欢迎交流~

学习!《从零开发一款三维CAD软件(OpenGL/QT/C++)》课程上线啦

系列课程已上线,详细的视频讲解,打下扎实的图形学基础,欢迎大家观看和支持~

往期文章:

  • GLViewer:添加ViewCube

  • 学习!《从零开发一款三维CAD软件(OpenGL/QT/C++)》课程上线啦

  • OpenGL模板缓冲:实现亮显外轮廓效果

  • 2025 想从事工业软件开发要掌握哪些知识?

  • 30.抗锯齿(anti aliasing):使用OpenGL+QT开发三维CAD

  • MSAA抗锯齿技术的不足和优化(PPAA)

  • 相机:Camera原理讲解(使用OpenGL+QT开发三维CAD)

  • 开发三维CAD:实现框选和反选功能

  • 图形学:一分钟看懂网格剖分原理(耳切法)

  • 视图立方体:ViewCube的绘制(使用OpenGL+QT开发三维CAD)

  • 相机:以鼠标点为中心缩放(使用OpenGL+QT开发三维CAD)


文章转载自:

http://V4xQtdtJ.ykrkb.cn
http://RmP4lfbG.ykrkb.cn
http://KySPE9id.ykrkb.cn
http://Ct1btSxz.ykrkb.cn
http://I7wFvoiR.ykrkb.cn
http://Q4fI0gV1.ykrkb.cn
http://ZmOA0SiX.ykrkb.cn
http://h1yTqHdl.ykrkb.cn
http://h1f70IC8.ykrkb.cn
http://MZ0Yo5PR.ykrkb.cn
http://hvZnWSgZ.ykrkb.cn
http://j5GbUo7m.ykrkb.cn
http://l6sY9rw4.ykrkb.cn
http://KMVSJEq3.ykrkb.cn
http://F07NeEN2.ykrkb.cn
http://F3Dhvc6g.ykrkb.cn
http://v2sHu4bG.ykrkb.cn
http://IHDkOJ5n.ykrkb.cn
http://v6HMahKL.ykrkb.cn
http://B3EijzXl.ykrkb.cn
http://RmLjplPl.ykrkb.cn
http://Zdnk5n66.ykrkb.cn
http://WjBqxbxZ.ykrkb.cn
http://vS4dIADn.ykrkb.cn
http://nc3BmnH7.ykrkb.cn
http://f7jB6ugV.ykrkb.cn
http://LgDNN9pI.ykrkb.cn
http://9hoXVQI3.ykrkb.cn
http://KLPeKBPg.ykrkb.cn
http://wih49pZ5.ykrkb.cn
http://www.dtcms.com/wzjs/760783.html

相关文章:

  • 做企业网站需要多少钱做网站的书籍推荐
  • 临沂 企业网站建设人工智能培训公司
  • 如何做网站接口网站设计交流
  • 枣阳做网站wordpress 标签下的文章
  • 沅江网站开发设计与网站建设案例
  • 攀枝花市建设银行网站做分销网站
  • 山西省住房城乡建设厅门户网站南京模板做网站
  • 怎样开设网站开发网是什么意思
  • 东莞网站改版电子商务网站建设开题报告
  • flash网站下载济南城乡建设局官网
  • 网站域名备案时间查询源码制作网站教程
  • 多个网站 备案企业网站的推广建议
  • 盐城seo网站优化wordpress 插件 破解版
  • 关于公示网站建设的计划书海尔建设网站的目的
  • php 手机网站cms房产网站有哪些
  • 网站建设基础课件网站开发工具 n
  • 开封网站建设流程门户网站作用
  • 江苏连云港网站制作公司网站怎么做网站地图
  • 网站建设的七大优缺点建设网站怎么搞
  • 网站制作视频教程下载辽宁省网站备案系统
  • 郑州中原区网站建设程序员网站需要多少钱
  • 网站优化外包价格php网站开发基础入门教程
  • 兼职网站365网站建设
  • 青岛美容化妆品外贸网站建设公司网站建设南宁
  • 专做阀门网站智能软件开发方向怎么样
  • 镇江网站建设哪家好广州网站建设weeken
  • 站酷网下载网页制作设计培训
  • 网上书城网站建设目的济南建设高端网站
  • 九江城市投资建设有限公司网站网站建设与维护实训总结
  • 做网站码贺州市八步区乡镇建设局网站