Skip to content

Commit

Permalink
渲染trail/component加properties
Browse files Browse the repository at this point in the history
  • Loading branch information
xdedss committed Jul 14, 2021
1 parent 7029758 commit e9dd0c9
Show file tree
Hide file tree
Showing 8 changed files with 146 additions and 45 deletions.
23 changes: 23 additions & 0 deletions Component.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#include "Component.h"



static std::map<QString, QVariant> defaultProp = {
{"enabled", true},
};

QVariant Component::getProp(const QString & key)
{
if (properties.count(key) > 0) {
return properties[key];
}
if (defaultProp.count(key) > 0) {
return defaultProp[key];
}
throw "no such property!";
}

void Component::setProp(const QString & key, QVariant value)
{
properties[key] = value;
}
10 changes: 10 additions & 0 deletions Component.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,26 @@


#include "nesteddefs.h"
#include "qvariant.h"
#include "qabstractitemmodel.h"

// 组件的基类。里面的事件会由widget调用
class Component {

protected:
std::map<QString, QVariant> properties;

public:
HierarchyObject* hierarchyObject;

virtual void onInit() {};
virtual void onUpdate() {};

public:
QVariant getProp(const QString& key);
void setProp(const QString& key, QVariant value);


};


Expand Down
4 changes: 3 additions & 1 deletion HierarchyObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,9 @@ void HierarchyObject::updateRecursively()
if (!enabled) return;
for (auto component : components) {
assert(component);
component->onUpdate();
if (component->getProp("enabled").toBool()) {
component->onUpdate();
}
}
for (auto child : children) {
assert(child);
Expand Down
33 changes: 33 additions & 0 deletions Trail.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ void Trail::onUpdate()
assert(child);
keypoints.push_back(child->localToWorld());
}
updateRenderer();
}
}

Expand All @@ -25,6 +26,38 @@ bool Trail::compareDiff()
return false;
}

void Trail::updateRenderer()
{
// 从hierarchyObject上获取LineRenderer
if (renderer == NULL) {
renderer = hierarchyObject->getComponent<LineRenderer>();
}
// 如果没有的话就添加一个
if (renderer == NULL) {
renderer = new LineRenderer();
renderer->lineWidth = 1;
renderer->continuous = false;
hierarchyObject->addComponent(renderer);
}

const int numSegments = 10; // 每两个关键点之间的渲染段数

QVector3D color = { 0.0, 1.0, 0.0 };
std::vector<Vertex> vertices;
if (keypoints.size() > 0) {
glm::vec3 pos0 = interpolate(0) * glm::vec4(0, 0, 0, 1);
vertices.push_back(Vertex({ pos0.x, pos0.y, pos0.z }, color));
}
for (int i = 0; i < keypoints.size() - 1; i++) {
for (int j = 1; j <= numSegments; j++) {
glm::vec3 pos = interpolate(i + (float)j / numSegments) * glm::vec4(0, 0, 0, 1);
vertices.push_back(Vertex({ pos.x, pos.y, pos.z }, color));
}
}
renderer->setVertices(vertices);

}

glm::mat4 Trail::interpolate(float t)
{
int tf = keypoints.size() - 1;
Expand Down
6 changes: 6 additions & 0 deletions Trail.h
Original file line number Diff line number Diff line change
@@ -1,23 +1,29 @@
#pragma once
#include "Component.h"
#include "LineRenderer.h"
#include <vector>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <glm/gtx/quaternion.hpp>
#include <glm/gtx/matrix_decompose.hpp>

class Trail :
public Component
{

public:
std::vector<glm::mat4> keypoints;
LineRenderer* renderer = NULL;

void onUpdate() override;

// 检查子物体有没有更新
bool compareDiff();

// 更新对应的轨迹渲染器
void updateRenderer();

// 插值(得到的是local2world)
glm::mat4 interpolate(float t);

Expand Down
1 change: 1 addition & 0 deletions mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ MainWindow::MainWindow(QWidget *parent) :
addKeypoint(trailTest, hierarchy, 3.14159 / 4, { 0, 1, 0 }, { 3, 1, 3 });
addKeypoint(trailTest, hierarchy, 3.14159 / 2, { 0, 1, 0 }, { 4, 0.5, -1 });
addKeypoint(trailTest, hierarchy, 3.14159 / 2 + 0.5, { 0, 1, 0 }, { 2, 0.5, -5 });
addKeypoint(trailTest, hierarchy, 3.14159 * 3 / 4, { 0, 1, 0 }, { 0, 0.5, -5 });


//ui->treeView_hierarchy->addAction(ui->actionbar);
Expand Down
113 changes: 69 additions & 44 deletions widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,20 @@ glm::vec3 Widget::get_ray(int mousex, int mousey, int screenWidth, int screenHei
return glm::vec3(ray.x, ray.y, ray.z);
}

void Widget::getRayWorld(int mousex, int mousey, glm::vec3 out_source, glm::vec3 out_direction)
{
glm::vec4 ndc((float)mousex * 2 / (float)screenWidth - 1, (float)mousey * 2 / (float)screenHeight - 1, 1.0f, 1.0f);//获取归一化坐标
glm::vec4 pointView = glm::inverse(projection) * ndc;//获取相机坐标系的分量列阵
pointView.y *= -1;//左手系转右手系
pointView /= pointView.w;//把第四维度转成1
glm::mat4 invView = glm::inverse(view);
glm::vec4 rayView = pointView - glm::vec4(0, 0, 0, 1);
out_source = invView * glm::vec4(0, 0, 0, 1);
//返回归一化向量
glm::vec3 ray = invView * rayView;
out_direction = glm::normalize(ray);
}


bool Widget::mousepick(int mousex, int mousey, HierarchyObject *& objout, int &iout) {
std::vector < glm::vec4 > getpoints;
Expand Down Expand Up @@ -272,6 +286,60 @@ void Widget::fixedUpdate() {
// 更新lastx lasty
mouselastx = mousex;
mouselasty = mousey;



// -------默认相机矩阵初始化--------
//透视(视锥上下面之间的夹角,宽高比,即视窗的宽/高,近截面、远截面的深度)
projection = glm::perspective(glm::radians(45.0f), screenWidth / (float)screenHeight, 0.01f, 300.0f);
//相机位置更新
//相机旋转矩阵,pos旋转后 = camRotation * pos旋转前
//auto camRotation = glm::angleAxis(yaw, glm::vec3(0, 1, 0)) * glm::angleAxis(pitch, glm::vec3(1, 0, 0));
camPos = camRot * glm::vec3(0, 0, distance) + camTarget;////可以实现绕不同点转 camTarget 表示相机拍摄视角的目标点
//glm::vec3 camUp = camRot * glm::vec3(0, 1, 0);//相机y轴(相机正上方)的指向。。。默认相机永远在被观察物体的z轴上
view = glm::transpose(glm::toMat4(camRot)) * glm::translate(glm::identity<glm::mat4>(), -camPos); //四元数转旋转矩阵


// --------update------
hierarchy->root->updateRecursively();

// --------trail-------
if (Input::getKeyDown(Qt::Key::Key_T)) {
currentTrail = hierarchy->root->getChildren("trailTest")->getComponent<Trail>();
currentTrailTime = 0;
}
if (Input::getKeyDown(Qt::Key::Key_H)) {
auto r = hierarchy->root->getChildren("trailTest")->getComponent<LineRenderer>();
r->setProp("enabled", !r->getProp("enabled").toBool());
}
if (currentTrail != NULL) {
currentTrailTime += 0.01f;
if (currentTrailTime > currentTrail->keypoints.size() - 1) {
currentTrail = NULL;
currentTrailTime = 0;
}
else {
glm::mat4 camMat = currentTrail->interpolate(currentTrailTime);
view = glm::inverse(camMat);
}
}

// ----- handle -----
if (hierarchy->lastSelected == NULL) {
handleObj->enabled = false;
}
else {
handleObj->enabled = true;
glm::mat4 rawMat = hierarchy->lastSelected->localToWorld();
// 按屏幕内固定大小缩放
glm::vec3 xw = rawMat * glm::vec4(1, 0, 0, 0);
glm::vec3 pos = rawMat * glm::vec4(0, 0, 0, 1);
glm::vec3 camPos = glm::inverse(view) * glm::vec4(0, 0, 0, 1);
float d = glm::length(pos - camPos);
handleObj->transform = glm::scale(rawMat, 0.1f / glm::length(xw) * d * glm::vec3(1, 1, 1));
}


update();//重新渲染
}

Expand Down Expand Up @@ -337,7 +405,7 @@ void Widget::renderObjectRecursively(const glm::mat4& proj, const glm::mat4& vie
glm::mat4 transform = parentTransform * obj->transform;
for (int i = 0; i < obj->componentsCount(); i++) {
Renderer* renderer = obj->getComponent<Renderer>(i);
if (renderer) {
if (renderer && renderer->getProp("enabled").toBool()) {
handleDefaultShader(renderer);
renderer->onRender(functions(), proj, view, transform);
}
Expand All @@ -353,51 +421,8 @@ void Widget::paintGL()
glClearColor(0.2f, 0.5f, 0.9f, 1.0f); //清屏
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓冲

//透视(视锥上下面之间的夹角,宽高比,即视窗的宽/高,近截面、远截面的深度)
projection = glm::perspective(glm::radians(45.0f), screenWidth / (float)screenHeight, 0.01f, 300.0f);
//相机位置更新
//相机旋转矩阵,pos旋转后 = camRotation * pos旋转前
//auto camRotation = glm::angleAxis(yaw, glm::vec3(0, 1, 0)) * glm::angleAxis(pitch, glm::vec3(1, 0, 0));
camPos = camRot * glm::vec3(0, 0, distance) + camTarget;////可以实现绕不同点转 camTarget 表示相机拍摄视角的目标点
//glm::vec3 camUp = camRot * glm::vec3(0, 1, 0);//相机y轴(相机正上方)的指向。。。默认相机永远在被观察物体的z轴上
view = glm::transpose(glm::toMat4(camRot)) * glm::translate(glm::identity<glm::mat4>(), -camPos); //四元数转旋转矩阵

assert(hierarchy);

// --------update------
hierarchy->root->updateRecursively();

// --------trail-------
if (Input::getKeyDown(Qt::Key::Key_T)) {
currentTrail = hierarchy->root->getChildren("trailTest")->getComponent<Trail>();
currentTrailTime = 0;
}
if (currentTrail != NULL) {
currentTrailTime += 0.01f;
if (currentTrailTime > currentTrail->keypoints.size() - 1) {
currentTrail = NULL;
currentTrailTime = 0;
}
else {
glm::mat4 camMat = currentTrail->interpolate(currentTrailTime);
view = glm::inverse(camMat);
}
}

// ----- handle -----
if (hierarchy->lastSelected == NULL) {
handleObj->enabled = false;
}
else {
handleObj->enabled = true;
glm::mat4 rawMat = hierarchy->lastSelected->localToWorld();
// 按屏幕内固定大小缩放
glm::vec3 xw = rawMat * glm::vec4(1, 0, 0, 0);
glm::vec3 pos = rawMat * glm::vec4(0, 0, 0, 1);
glm::vec3 camPos = glm::inverse(view) * glm::vec4(0, 0, 0, 1);
float d = glm::length(pos - camPos);
handleObj->transform = glm::scale(rawMat, 0.1f / glm::length(xw) * d * glm::vec3(1, 1, 1));
}

// --------渲染--------
// 渲染天空
Expand Down
1 change: 1 addition & 0 deletions widget.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ private slots:
bool mousepick(int mousex, int mousey, HierarchyObject*& objout, int& iout);
glm::vec3 get_ray(int mousex, int mousey, int screenWidth, int screenHeight,
glm::mat4 matModel, glm::vec4& init_point);
void getRayWorld(int mousex, int mousey, glm::vec3 out_source, glm::vec3 out_direction);

protected:
void initializeGL() override;
Expand Down

0 comments on commit e9dd0c9

Please sign in to comment.