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

企业网站源码php优化网站平台

企业网站源码php,优化网站平台,网络营销在我国的发展历程,西乡建网站公司项目根据LearnOpenGL配置Qt的相机,更新view矩阵和project矩阵的位移向量变得很大,我设置的明明相机位置是(0,0,3),理想的位移向量刚好是相反数(0,0,-3),对应的view矩阵位置向量可以变成(0,0,1200)…离模型非常远矩阵模型也看不见&…

项目根据LearnOpenGL配置Qt的相机,更新view矩阵和project矩阵的位移向量变得很大,我设置的明明相机位置是(0,0,3),理想的位移向量刚好是相反数(0,0,-3),对应的view矩阵位置向量可以变成(0,0,1200)…离模型非常远矩阵模型也看不见:

#include "UI/RobotView.h"
#include <QtCore/QtGlobal>
#include <QtCore/QFile>
#include <QtCore/QDebug>
#include <QtGui/QMouseEvent>
#include <QtGui/QWheelEvent>
#include <QtGui/QOpenGLShaderProgram>
#include <QtGui/QOpenGLBuffer>
#include <QtGui/QOpenGLVertexArrayObject>
#include <QtGui/QMatrix4x4>
#include <QtGui/QVector3D>
#include <QtWidgets/QOpenGLWidget>
#include <QElapsedTimer>
#include <QtMath>#include <urdf_model/model.h>
#include <urdf_parser/urdf_parser.h>RobotView::RobotView(QWidget *parent) : QOpenGLWidget(parent),VBO(QOpenGLBuffer::VertexBuffer),model_(nullptr),firstMouse(true),cameraZoom(45.0f),cameraYaw(-90.0f),cameraPitch(0.0f),cameraPosition(0.0f, 0.0f, 3.0f),worldUp(0.0f, 1.0f, 0.0f),cameraFront(0.0f, 0.0f, -1.0f), //*cameraUp(0.0f, 1.0f, 0.0f),mouseSensitivity(0.1f)
{setFocusPolicy(Qt::StrongFocus);frameCount = 0;fps = 0.0f;fpsTimer = new QTimer(this);connect(fpsTimer, &QTimer::timeout, this, [this](){fps = frameCount;frameCount = 0;emit sendFPS(fps); // 发送帧率信号});fpsTimer->start(1000);updateTimer = new QTimer(this);connect(updateTimer, &QTimer::timeout, this, [this](){ update(); });updateTimer->start(16); // 60 FPSmodel_ = new RobotModel();viewMatrix.lookAt(cameraPosition, cameraPosition + cameraFront, cameraUp);projectionMatrix.perspective(cameraZoom, float(width()) / float(height()), 0.01f, 200.0f);if (!model_->loadFromURDF(":/assets/instrument_sim/urdf/instrument_sim.urdf")){qCritical() << "Failed to load URDF file";delete model_;}
}RobotView::~RobotView()
{delete fpsTimer;delete updateTimer;delete model_;fpsTimer = nullptr;updateTimer = nullptr;model_ = nullptr;cleanupGL();
}void RobotView::initializeGL()
{initializeOpenGLFunctions();VAO.create();VBO.create();VAO.bind();VBO.bind();if (!initShaders()){qCritical() << "Failed to initialize shaders";return;}VAO.release();VBO.release();glEnable(GL_DEPTH_TEST);
}void RobotView::resizeGL(int w, int h)
{glViewport(0, 0, w, h);
}void RobotView::paintGL()
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glClearColor(0.2f, 0.3f, 0.3f, 1.0f);shaderProgram.bind();projectionMatrix.perspective(cameraZoom, float(width()) / float(height()), 0.01f, 200.0f);viewMatrix.lookAt(cameraPosition, cameraPosition + cameraFront, cameraUp);// 将矩阵传递给着色器shaderProgram.setUniformValue("lightPos", lightPos);shaderProgram.setUniformValue("viewPos", cameraPosition);shaderProgram.setUniformValue("objectColor", objectColor);shaderProgram.setUniformValue("lightColor", lightColor);shaderProgram.setUniformValue("projectionMatrix", projectionMatrix);shaderProgram.setUniformValue("viewMatrix", viewMatrix);VAO.bind();// // Draw robot modelauto &link = model_->getLinks()[1];if (link.visual){VBO.bind();VBO.allocate(link.visual->getVertices(), link.visual->getVerticesSize() * sizeof(float));modelMatrix.setToIdentity();shaderProgram.setUniformValue("modelMatrix", modelMatrix);// Draw trianglesint positionAttribute = shaderProgram.attributeLocation("aPos");shaderProgram.enableAttributeArray(positionAttribute);shaderProgram.setAttributeBuffer(positionAttribute, GL_FLOAT, 0, 3, 6 * sizeof(GLfloat));// 设置顶点属性int normalAttribute = shaderProgram.attributeLocation("aNormal");shaderProgram.enableAttributeArray(normalAttribute);shaderProgram.setAttributeBuffer(normalAttribute, GL_FLOAT, 3 * sizeof(GLfloat), 3, 6 * sizeof(GLfloat));glDrawArrays(GL_TRIANGLES, 0, link.visual->getVerticesSize() / 6);VBO.release();}VAO.release();shaderProgram.release();frameCount++;
}bool RobotView::initShaders()
{// Load vertex shaderQFile vertShaderFile(":/assets/shaders/phongShader.vert");if (!vertShaderFile.open(QIODevice::ReadOnly | QIODevice::Text)){qCritical() << "Failed to open vertex shader file:" << vertShaderFile.fileName();doneCurrent();return false;}QString vertShaderSource = vertShaderFile.readAll();vertShaderFile.close();// Load fragment shaderQFile fragShaderFile(":/assets/shaders/phongShader.frag");if (!fragShaderFile.open(QIODevice::ReadOnly | QIODevice::Text)){qCritical() << "Failed to open fragment shader file:" << fragShaderFile.fileName();return false;}QString fragShaderSource = fragShaderFile.readAll();fragShaderFile.close();// Compile shadersif (!shaderProgram.addShaderFromSourceCode(QOpenGLShader::Vertex, vertShaderSource)){qCritical() << "Failed to compile vertex shader:" << shaderProgram.log();return false;}if (!shaderProgram.addShaderFromSourceCode(QOpenGLShader::Fragment, fragShaderSource)){qCritical() << "Failed to compile fragment shader:" << shaderProgram.log();return false;}// Link shader programif (!shaderProgram.link()){qCritical() << "Failed to link shader program:" << shaderProgram.log();return false;}return true;
}void RobotView::mouseMoveEvent(QMouseEvent *event)
{// update Front, Right and Up Vectors using the updated Euler anglesif (event->buttons() & Qt::LeftButton){float xPos = event->x();float yPos = event->y();if (firstMouse){lastMousePosX = xPos;lastMousePosY = yPos;firstMouse = false;}float xoffset = xPos - lastMousePosX;float yoffset = lastMousePosY - yPos;lastMousePosX = xPos;lastMousePosY = yPos;xoffset *= mouseSensitivity;yoffset *= mouseSensitivity;cameraYaw += xoffset;cameraPitch += yoffset;// make sure that when pitch is out of bounds, screen doesn't get flippedif (cameraPitch > 89.0f)cameraPitch = 89.0f;if (cameraPitch < -89.0f)cameraPitch = -89.0f;QVector3D front;front.setX(cos(qDegreesToRadians(cameraYaw)) * cos(qDegreesToRadians(cameraPitch)));front.setY(sin(qDegreesToRadians(cameraPitch)));front.setZ(sin(qDegreesToRadians(cameraYaw)) * cos(qDegreesToRadians(cameraPitch)));cameraFront = front.normalized();}}void RobotView::cleanupGL()
{makeCurrent();VAO.destroy();VBO.destroy();shaderProgram.removeAllShaders();doneCurrent();
}

解决办法:

  1. 在每一次使用lookat和perspective函数前都将矩阵置为identity,根据手册,这两个函数api和glm不一样,会一直连乘之前的矩阵,所以调用这个函数api,先得吧矩阵view和project变为单位阵,防止一直连乘跑飞
    在这里插入图片描述

在这里插入图片描述

projectionMatrix.setToIdentity();
projectionMatrix.perspective(cameraZoom, float(width()) / float(height()), 0.01f, 200.0f);
viewMatrix.setToIdentity();
viewMatrix.lookAt(cameraPosition, cameraPosition + cameraFront, cameraUp);

加了以后好一点了,但是鼠标拖拽有时候移动到其他位置再拖动,模型会突然跳一下,分析了一下原因是因为鼠标的位置没有及时更新:

  1. 在构造函数加上鼠标的跟踪,修改把获取位置更新上一时刻位置放在if判断外面:

void RobotView::mouseMoveEvent(QMouseEvent *event)
{// update Front, Right and Up Vectors using the updated Euler anglesfloat xPos = event->x();float yPos = event->y();if (event->buttons() & Qt::LeftButton){if (firstMouse){lastMousePosX = xPos;lastMousePosY = yPos;firstMouse = false;}float xoffset = xPos - lastMousePosX;float yoffset = lastMousePosY - yPos;xoffset *= mouseSensitivity;yoffset *= mouseSensitivity;cameraYaw += xoffset;cameraPitch += yoffset;// make sure that when pitch is out of bounds, screen doesn't get flippedif (cameraPitch > 89.0f)cameraPitch = 89.0f;if (cameraPitch < -89.0f)cameraPitch = -89.0f;QVector3D front;front.setX(cos(qDegreesToRadians(cameraYaw)) * cos(qDegreesToRadians(cameraPitch)));front.setY(sin(qDegreesToRadians(cameraPitch)));front.setZ(sin(qDegreesToRadians(cameraYaw)) * cos(qDegreesToRadians(cameraPitch)));cameraFront = front.normalized();// viewMatrix.setToIdentity();// viewMatrix.lookAt(cameraPosition, cameraPosition + cameraFront, cameraUp);}lastMousePosX = xPos;lastMousePosY = yPos;
}

但是发现还是有问题,貌似mouseMove事件需要按键按下才触发,鼠标的位置没有得到及时更新,经过查资料,推测可能是没有开启鼠标的跟踪,在构造函数加入下面的语句就可以了

setMouseTracking(true);

调bug还是看看用户手册的好

http://www.dtcms.com/wzjs/235777.html

相关文章:

  • 国内网站开发的主流技术策划方案怎么做
  • 站长工具alexa排名网站是怎么做出来的
  • 网络推广计划北京seo顾问
  • 甘肃建设厅执业资格注册中心网站金华seo扣费
  • 西安网站开发高端网站开发百度竞价排名怎么靠前
  • 赌球网站推广怎么做关键词优化公司推荐
  • 二维码生成器小程序免费版seo关键词排名点击工具
  • 长沙网站建设公司哪家好公司网站怎么注册
  • 做vi的网站深圳推广公司推荐
  • 成都住建局官网蓉e办网页seo搜索引擎优化
  • wordpress主题友情链接设置seo关键词优化推广哪家好
  • 荣耀正品查询入口整站优化外包服务
  • 基金项目实验室信息网站建设软文推广发布平台
  • ps网站设计素材公司官网模板
  • 中小学网站建设百度开户需要什么资质
  • 西安做网站选哪家公司自己做一个网站需要多少钱
  • 网站商城系统设计友情链接交换条件
  • 网站制作培训机构给公司做网站要多少钱
  • 长沙法律咨询网站设计开发泉州seo排名扣费
  • wordpress 安装 此网页包含重定向循环做网站怎么优化
  • 企业网站开发外包公司中国推广网
  • 做网站需要走哪些程序杭州百度seo优化
  • 社交公众号开发公司搜索引擎优化大致包含哪些内容或环节
  • 网站被k 申诉吴中seo网站优化软件
  • 电子商务网站建设的答案什么是指数基金
  • html5模板网站企业网络营销策划方案范文
  • 做aelogo动效有什么好的网站免费发帖推广平台
  • 怎么样做电影网站深圳关键词优化
  • 百度推广的网站怎么做专门做排行榜的软件
  • 如何做好一个百度竞价网站网络建站平台