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

网站建设的开发方式和费用wordpress导航字体大小

网站建设的开发方式和费用,wordpress导航字体大小,wordpress 古风主题,环球外贸文章目录QTOpenGL鼠标操作和模型控制鼠标拾取理论有点小复杂从鼠标计算射线第 0 步#xff1a;2D 视口坐标第 1 步#xff1a;3d归一化设备坐标第 2 步#xff1a;4d齐次剪辑坐标第 3 步#xff1a;4d眼(相机)坐标第 4 步#xff1a;4d 世界坐标代码展示模型控制多模型加载… 文章目录QTOpenGL鼠标操作和模型控制鼠标拾取理论有点小复杂从鼠标计算射线第 0 步2D 视口坐标第 1 步3d归一化设备坐标第 2 步4d齐次剪辑坐标第 3 步4d眼(相机)坐标第 4 步4d 世界坐标代码展示模型控制多模型加载选中模型模型旋转和移动QTOpenGL鼠标操作和模型控制 本篇完整工程见gitee:QtOpenGL 对应点的tag由turbolove提供技术支持您可以关注博主或者私信博主 鼠标拾取 需要将世界坐标转换为视口坐标 void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *data);理论有点小复杂 Mouse Picking with Ray Casting - Anton’s OpenGL 4 Tutorials (antongerdelan.net) 参考这篇文章 这部分不懂的话暂时是没关系的可以接着往下看代码然后去看我的项目。 光线追踪法 从鼠标投射 3D 射线 通过摄像机进入场景然后检查该光线是否与某个对象相交。 从鼠标计算射线 第 0 步2D 视口坐标 range [0:width, height:0] 我们从鼠标光标坐标开始。这些是 2d并且在视口坐标系中。首先我们需要获取鼠标 xy 像素 坐标。 如果是QT的话可以直接使用QT的mousePressEvent的evnet-pos(); 这给了我们一个 x 在 0width 和 y 从height0 开始。请记住0 位于此处的屏幕顶部因此 y 轴方向与其他坐标系中的方向相反。 第 1 步3d归一化设备坐标 range [-1:1, -1:1, -1:1] 下一步是将其转换为 3D 规范化设备坐标。 这应该在 x [-11] y [-11] 和 z [-11] 的范围内。我们有一个 x 和 y已经所以我们缩放它们的范围并反转y的方向。 float x (2.0f * mouse_x) / width - 1.0f; float y 1.0f - (2.0f * mouse_y) / height; float z 1.0f; vec3 ray_nds vec3(x, y, z);第 2 步4d齐次剪辑坐标 range [-1:1, -1:1, -1:1, -1:1] 我们希望我们的射线的z指向前方 - 这通常是 OpenGL 样式中的负 z 方向。我们可以添加一个 这样我们就有一个 4d 向量w, 当然对于QT我们可以用QVector4D替换下面的vec4. vec4 ray_clip vec4(ray_nds.xy, -1.0, 1.0);第 3 步4d眼(相机)坐标 range [-x:x, -y:y, -z:z, -w:w] 通常为了从眼睛空间进入剪辑空间我们将向量乘以 投影矩阵。我们可以通过乘以这个的倒数来倒退 矩阵。 vec4 ray_eye inverse(projection_matrix) * ray_clip;现在我们只需要取消x,y部分的投影所以让我们手动设置z,w部分的意思是“向前而不是一个点”。 ray_eye vec4(ray_eye.xy, -1.0, 0.0);第 4 步4d 世界坐标 range [-x:x, -y:y, -z:z, -w:w] 同样回到转换管道的另一个步骤。记住我们手动为z分量指定了一个-1这意味着我们的射线没有归一化。我们应该在使用它之前把它弄清楚。 vec3 ray_wor (inverse(view_matrix) * ray_eye).xyz; // dont forget to normalise the vector at some point ray_wor normalise(ray_wor);这将为我们平衡上下、左右和前进组件。所以假设我们的摄像机直接沿着-Z世界轴看当鼠标在屏幕中心时我们应该得到[0,0-1]而当鼠标在屏幕上移动时z值就不那么重要了。这将取决于纵横比以及视图和投影矩阵中定义的视场。我们现在有一条射线可以和世界空间中的曲面进行比较。 代码展示 // (传入参数为鼠标点击的坐标)计算世界坐标 QVector4D TurboOpenGLWidget::worldPositionFromMousePosition(const QPoint pos) {float winZ;glReadPixels((int)pos.x(), this-height() - (int)pos.y(),1,1,GL_DEPTH_COMPONENT, GL_FLOAT, winZ);float x (2.0 * pos.x()) / this-width() - 1.0f;float y 1.0f - (2.0f * pos.y()) / this-height();float z winZ * 2.0 -1.0f;float w (2.0 * near_ * far_) / (far_ near_ - z *(far_ - near_));QVector4D worldPosition(x, y, z, 1);worldPosition * w;worldPosition view.inverted() * projection.inverted() * worldPosition;return worldPosition; } 模型控制 多模型加载 我们需要用之前模型加载那一块的代码然后修改成可以加载多个模型的代码。 为此我们需要添加一个类型: struct ModelInfo {Model *model;QVector3D world_pos;float pitch;float roll;float yaw;bool is_selected;QString name; } QMapQString, ModelInfo models_;然后需要将loadModel 修改为多模型的 void TurboOpenGLWidget::loadModel(const QString file) {makeCurrent();static int model_i 0;Model *model new Model(QOpenGLContext::currentContext()-versionFunctionsQOpenGLFunctions_4_5_Core(),file.toStdString());camera_.setPosition(cameraPositionInit(model-max_y_, model-min_y_));models_[aa QString::number(model_i)] ModelInfo{model, QVector3D(0, 0, 0), 0.0, 0.0, 0.0, false, aa};doneCurrent(); }之后需要对绘制的地方进行修改遍历加载的模型然后绘制对应的模型。 选中模型 选中模型就是需要判断鼠标点击的位置和模型所在位置是否重叠如果在一定范围内是重叠的则认为我们选中了该模型。 // 判断鼠标是否选中模型 void TurboOpenGLWidget::mousePressEvent(QMouseEvent *event) {bool hasSelectedfalse;makeCurrent();if(event-buttons() Qt::LeftButton){QVector4D worldPosition;worldPosition worldPositionFromMousePosition(event-pos());emit sig_worldPosition(worldPosition);for(QMapQString, ModelInfo::iterator itermodels_.begin();iter!models_.end();iter){ModelInfo *modelInfoiter.value();float r(modelInfo-model-max_y_-modelInfo-model-min_y_)/2;if(modelInfo-world_pos.distanceToPoint(QVector3D(worldPosition))r!hasSelected){modelInfo-is_selectedtrue;hasSelectedtrue;}elsemodelInfo-is_selectedfalse;}}QWidget::mousePressEvent(event); }模型旋转和移动 // 双击时候选中模型 void TurboOpenGLWidget::mouseDoubleClickEvent(QMouseEvent *event) {Q_UNUSED(event);if(model_moving_){//再次双击取消移动model_moving_false;}elseforeach(auto modelInfo,models_){//双击启动移动if(modelInfo.is_selectedtrue)model_moving_true;}QWidget::mouseDoubleClickEvent(event); } // 如果是移动的状态则移动模型void TurboOpenGLWidget::mouseMoveEvent(QMouseEvent *event) {makeCurrent();static QPoint lastPos(width()/2, height()/2);if(model_moving_){for(auto itermodels_.begin();iter!models_.end();iter){ModelInfo *modelInfoiter.value();if(!modelInfo-is_selected) continue;modelInfo-world_posQVector3D(worldPositionFromMousePosition(event-pos());}}else if(event-buttons() Qt::RightButton|| event-buttons() Qt::LeftButton|| event-buttons() Qt::MiddleButton){auto currentPosevent-pos();QPoint deltaPoscurrentPos-lastPos;lastPoscurrentPos;if(event-buttons() Qt::RightButton)camera_.processMouseMovement(deltaPos.x(),-deltaPos.y());elsefor(auto itermodels_.begin();iter!models_.end();iter){ModelInfo *modelInfoiter.value();if(!modelInfo-is_selected) continue;if(event-buttons() Qt::MiddleButton){modelInfo-rolldeltaPos.x();}else if(event-buttons() Qt::LeftButton){modelInfo-yawdeltaPos.x();modelInfo-pitchdeltaPos.y();}}}doneCurrent(); }
http://www.tj-hxxt.cn/news/232117.html

相关文章:

  • wordpress怎样更改文章阅读次数哈尔滨百度推广排名优化
  • 网站建设定制做ic哪些网站好做
  • 企业网站建设费用详情网站建设什么公司专业
  • 网站需求说明东莞设计网站推荐
  • 网站备案点不进去一般做网站服务器的cpu
  • 网站设计公司-信科网络wordpress支付集成
  • 网站管理助手ftp连接不上网站建设发展趋势
  • 建设维护网站未签订合同学做网站难不难
  • 购物网站怎么建设七牛云动静分离wordpress
  • 企业官网门户网站管理系统如何与知名网站做友情链接
  • 咸阳免费做网站公司easyui 做的网站
  • 苏州免费网站制作企业网站开发公司有哪些
  • 网站推广文章 优帮云深圳建网站培训机构
  • 网页设计网站期末作业做网站模板哪里买
  • 上海网站seoseodian建设银行企业理念
  • 保定专门做网站的公司临沂网站模板
  • 成品网站 售卖爱设计网
  • 搭建个人视频网站个人网站要有什么
  • 新乡手机网站建设服务海南注册公司多少钱
  • woocommerce做零售网站化妆品网站建设目标与期望
  • 微信导购网站怎么做视频教学建网站软件有哪些
  • 数码庄园的网站建设公司苏州做网站企业
  • 山西阳泉王平 做网站河南网站建站系统平台
  • 培训中心网站建设论文网络营销十大成功案例
  • 网站核验单 没有网站 怎么办980网站
  • 网站关键词是什么网站建设扌首选金手指
  • wordpress怎么上传网站wordpress 短信
  • 自适应网站建设公司网站建设与运营合同
  • 专题网站建设策划百度外推发帖软件
  • 欧美电影免费网站广告平台