我正在研究布料模拟器。它将布料建模为点之间具有弹簧质量约束的点的网格。例如,it has similar concepts as described in this tutorial。
对于渲染,我使用的是使用nanogui GLShader对象的其他人的代码。它具有在线框中渲染布料的选项,以及通过两个选项提供的“平滑”选项(后者是我们感兴趣的'phong'着色器。这是clothSimulator.h
和{{ 1}}:
clothSimulator.cpp
在cpp文件中:
#ifndef CGL_CLOTH_SIMULATOR_H
#define CGL_CLOTH_SIMULATOR_H
#include <nanogui/nanogui.h>
#include <zmq.hpp>
#include "camera.h"
#include "cloth.h"
#include "collision/collisionObject.h"
using namespace nanogui;
class ClothSimulator {
private:
virtual void initGUI(Screen *screen);
void drawWireframe(GLShader &shader);
void drawNormals(GLShader &shader);
void drawPhong(GLShader &shader);
// OpenGL attributes
enum e_shader { WIREFRAME = 0, NORMALS = 1, PHONG = 2 };
e_shader activeShader = WIREFRAME;
vector<GLShader> shaders;
GLShader wireframeShader;
GLShader normalShader;
GLShader phongShader;
// a bunch of other stuff here ...
通常的想法是采用所有点,并使用着色器方法将它们渲染为三角形。 // a bunch of other stuff above ...
void ClothSimulator::drawPhong(GLShader &shader) {
int num_tris = cloth->clothMesh->triangles.size();
MatrixXf positions(3, num_tris * 3);
MatrixXf normals(3, num_tris * 3);
for (int i = 0; i < num_tris; i++) {
Triangle *tri = cloth->clothMesh->triangles[i];
Vector3D p1 = tri->pm1->position;
Vector3D p2 = tri->pm2->position;
Vector3D p3 = tri->pm3->position;
Vector3D n1 = tri->pm1->normal();
Vector3D n2 = tri->pm2->normal();
Vector3D n3 = tri->pm3->normal();
positions.col(i * 3) << p1.x, p1.y, p1.z;
positions.col(i * 3 + 1) << p2.x, p2.y, p2.z;
positions.col(i * 3 + 2) << p3.x, p3.y, p3.z;
normals.col(i * 3) << n1.x, n1.y, n1.z;
normals.col(i * 3 + 1) << n2.x, n2.y, n2.z;
normals.col(i * 3 + 2) << n3.x, n3.y, n3.z;
}
Vector3D cp = camera.position();
shader.setUniform("in_color", color);
shader.setUniform("eye", Vector3f(cp.x, cp.y, cp.z));
shader.setUniform("light", Vector3f(0.5, 2, 2));
shader.uploadAttrib("in_position", positions);
shader.uploadAttrib("in_normal", normals);
shader.drawArray(GL_TRIANGLES, 0, num_tris * 3);
}
// a bunch of other stuff below
方法似乎很重要。不幸的是,我不知道我能提供什么选择。 The documentation for the method appears to be limited,如果我使用的是正确的链接。
我现在拥有它的方式,布料呈现如下(示例):
但是,这使一块布非常“薄”。我希望增加渲染器中布料的厚度。是否应该调整传递给shader.drawArray
的参数?还是调整我如何初始化着色器对象本身?我上面链接的教程实际上包含“ quil缝”布料的部分-这是最直接的(或唯一的)解决方案吗?
我希望这能传达我希望问的基本知识。请让我知道是否可以做些使其更容易理解的事情。