- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我的 GLUT/OpenGL 练习中,我必须加载 3 个不同的对象,我给它们一个 file.m。这是通过读取该文件、创建列表并最终调用 glCallList() 来完成的。选择一个对象后,我必须如何启用平移和旋转对象的可能性。所以我有:
#define OBJECTS 3
float objAngle[OBJECTS], objAxis[OBJECTS][3], objWAxis[OBJECTS][3], objPos[OBJECTS][3], objWPos[OBJECTS][3];
float objScale[OBJECTS] = {1.0, 1.0, 1.0};
float translation_var[OBJECTS][3];
translation_var[i][0] = translation_var[i][1] = translation_var[i][2] = 0.0;
并且都初始化为0.0
此外我还有:
float ocsmatrix[OBJECTS][16];
float wcsmatrix[OBJECTS][16];
初始化为:
for(i = 0; i < OBJECTS; i++) {
glGetFloatv(GL_MODELVIEW_MATRIX, ocsmatrix[i]);
glGetFloatv(GL_MODELVIEW_MATRIX, wcsmatrix[i]);
}
这是我的键盘功能的一部分:
void keyboard (unsigned char key, int x, int y) {
float* pos = NULL;
float step = 0.0;
if( mode == MODE_CHANGE_EYE_POS ) {
}
else if( mode == MODE_CHANGE_REFERENCE_POS ) {
pos = camC;
step = 0.1;
}
else if( mode == MODE_CHANGE_UP_POS ) {
pos = camU;
step = 0.1;
}
else if( mode == MODE_CHANGE_LIGHT_POS ) {
pos = lightPos;
step = 1.0;
}
else if( mode == MODE_ROTATE_OBJECT ) {
}
if( pos != NULL ) {
if( key == 'x' )
pos[0] += step;
else if( key == 'X' )
pos[0] -= step;
else if( key == 'y' )
pos[1] += step;
else if( key == 'Y' )
pos[1] -= step;
else if( key == 'z' )
pos[2] += step;
else if( key == 'Z' )
pos[2] -= step;
}
if (key == 'l') {
char path[32];
printf("Digitare file.m da caricare: data/file.m\n");
scanf("%s", path);
loadMeshModel(path); /* carico il file.m digitato da console */
}
if (key == '0') {
selected_object = 1;
printf("SELEZIONATO OGGETTO 0\n");
}
if (key == '1') {
selected_object = 2;
printf("SELEZIONATO OGGETTO 1\n");
}
if (key == '2') {
selected_object = 3;
printf("SELEZIONATO OGGETTO 2\n");
}
// gestione trasformazioni OCS
if(key == 'o') {
mode = MODE_TRANSLATE_OCS;
printf("TRASLAZIONE OCS ATTIVA\n");
}
else if(key == 'O') {
mode = MODE_ROTATE_OCS;
printf("ROTAZIONE OCS ATTIVA\n");
}
// gestione trasformazioni WCS
if(key == 'w') {
mode = MODE_TRANSLATE_WCS;
printf("TRASLAZIONE WCS ATTIVA\n");
}
else if(key == 'W') {
mode = MODE_ROTATE_WCS;
printf("ROTAZIONE WCS ATTIVA\n");
}
if(key == 'q') {
mode = MODE_QUADRICS;
}
else if(key == 'Q') {
mode = MODE_MODELS;
}
if( key == 27 ) //esc
exit(1);
if(selected_object > -1) {
if(mode == MODE_TRANSLATE_OCS) {
step = 0.1;
}
else if(mode == MODE_TRANSLATE_WCS) {
step = 0.1;
}
else if(mode == MODE_ROTATE_OCS) {
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMultMatrixf(ocsmatrix[selected_object]);
step = 2.0;
} else if(mode == MODE_ROTATE_WCS) {
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMultMatrixf(wcsmatrix[selected_object]);
step = 2.0;
}
}
if( selected_object > -1 )
{
if( key == 'x' ) {
translation_var[selected_object][0] += step;
if(mode == MODE_ROTATE_OCS || mode == MODE_ROTATE_WCS)
glRotatef(-step, 1.0, 0.0, 0.0);
}
else if( key == 'X' ) {
translation_var[selected_object][0] -= step;
if(mode == MODE_ROTATE_OCS || mode == MODE_ROTATE_WCS)
glRotatef(step, 1.0, 0.0, 0.0);
}
else if( key == 'y' ) {
translation_var[selected_object][1] += step;
if(mode == MODE_ROTATE_OCS || mode == MODE_ROTATE_WCS)
glRotatef(-step, 0.0, 1.0, 0.0);
}
else if( key == 'Y' ) {
translation_var[selected_object][1] -= step;
if(mode == MODE_ROTATE_OCS || mode == MODE_ROTATE_WCS)
glRotatef(step, 0.0, 1.0, 0.0);
}
else if( key == 'z' ) {
translation_var[selected_object][2] += step;
if(mode == MODE_ROTATE_OCS || mode == MODE_ROTATE_WCS)
glRotatef(-step, 0.0, 0.0, 1.0);
}
else if( key == 'Z' ) {
translation_var[selected_object][2] -= step;
if(mode == MODE_ROTATE_OCS || mode == MODE_ROTATE_WCS)
glRotatef(step, 0.0, 0.0, 1.0);
}
}
// Save rotation in relative matrixes
if(mode == MODE_ROTATE_OCS) {
glGetFloatv(GL_MODELVIEW_MATRIX, ocsmatrix[selected_object]);
glPopMatrix();
}
else if(mode == MODE_ROTATE_WCS) {
glGetFloatv(GL_MODELVIEW_MATRIX, wcsmatrix[selected_object]);
glPopMatrix();
}
glutPostRedisplay();
}
最后是 display()
glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT );
glShadeModel (GL_SMOOTH); //GL_FLAT
glLightfv( GL_LIGHT0, GL_POSITION, lightPos );
glEnable( GL_LIGHTING );
glEnable( GL_LIGHT0 );
glEnable(GL_DEPTH_TEST);
glEnable(GL_NORMALIZE);
glMatrixMode( GL_PROJECTION );
glLoadIdentity ();
gluPerspective( fovy, aspect, 1, 100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt( camE[0], camE[1], camE[2], camC[0], camC[1], camC[2], camU[0], camU[1], camU[2] );
// Trackball rotation.
glRotatef(tbAngle, tbAxis[0], tbAxis[1], tbAxis[2]);
glLineWidth(2);
drawAxis( 2.0, 1 );
glLineWidth(1);
glRotatef(angle[0], 1.0, 0.0, 0.0);
glRotatef(angle[1], 0.0, 1.0, 0.0);
glRotatef(angle[2], 0.0, 0.0, 1.0);
//draw the mesh model
drawAxis( 1.0, 0 );
for(i=0; i<loaded_objects; i++) {
glPushMatrix();
glMultMatrixf(wcsmatrix[i]);
glTranslatef(objWPos[i][0] + translation_var[i][0], objWPos[i][1] + translation_var[i][1], objWPos[i][2] + translation_var[i][2]);
glMultMatrixf(ocsmatrix[i]);
glTranslatef(objPos[i][0]+translation_var[i][0], objPos[i][1]+translation_var[i][1], objPos[i][2]+translation_var[i][2]);
glScalef( objScale[i], objScale[i], objScale[i]);
//draw the model
if(!wireframe)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
else
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glCallList(listname+i);
glPopMatrix();
}
glutSwapBuffers();
因此,这些是在 mesg 对象(在我的例子中是“ pig ”)显示在 3 个轴的中心后我在键盘上按下的按钮:
但是哈巴狗没有动。为什么?它似乎只适用于 translate_var[3] 而不适用于 translate_var[3][3]。但是,如果我使用单维数组,那么我将平移所有 3 个网格对象......另外,i-mesh对象和objPos/objWPos中的第i个位置是如何绑定(bind)的?
最佳答案
您的主要错误/误解是,您将 OpenGL 视为某种 3D 场景管理器。它不是。 OpenGL 所做的只是一次绘制一个点、线或三角形。显示列表是一种宏记录,仅此而已。
在您的键盘处理函数中,您通过操纵 OpenGL 变换矩阵对事件作出 react 。然而,这些矩阵只是绘图过程的另一个输入。仅仅操纵它们没有任何效果。此外,矩阵和“模型”之间没有“关联”,因为 OpenGL 没有模型。
所以你要做的是,在你的键盘处理程序中使用输入来操作你定义的变量;每个对象的一组变量(提示:struct
),然后标记 GLUT 它将在主应用程序循环的下一次迭代时调用显示处理程序(glutPostRedisplay
)。然后在显示例程中使用您在输入事件处理程序中操作的变量的值来为您要绘制的每个模型设置相应的转换矩阵,就在您绘制该模型之前。
关于c - 过剩/OpenGL : how to bind array of coordinates to mesh object to traslate/rotate them,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32950362/
我正在尝试安装 libmesh用于并行计算(固体力学问题)。 在安装过程中,我可以看到配置摘要,其中指出我在计算机上安装了几乎所有依赖项,但是一些重要功能,例如infinite elements和 n
我对 OGRE 图形引擎比较陌生,所以我的问题可能看起来太明显了,但是搜索相关信息没有成功。 鉴于: 我有一个 OGRE 应用程序,其中包含由一些网格、灯光、相机和纹理创建的场景。这很简单,我想。这一
给定一个网格(如左侧的立方体对象)和另一个自定义的类似球体的网格(右侧;如果更容易,它可以是另一种形状),Unity 和 C# 中的一个如何在运行时软包裹第二个网格围绕第一?谢谢! 最佳答案 以下方法
我有一个父节点的 webroot 路径,想返回这个节点的子节点。 使用 https://demo.getmesh.io/api/v1/demo/webroot/images/例如只产生节点本身。 最佳
我花了几个小时试图弄清楚为什么我看不到立方体内的文本,而且我不明白为什么它不起作用。 有两个网格,其中一个在另一个网格内部,但不可见。 当我注释将立方体网格添加到我的组中的行时,会出现文本(第 34
我正在将 GLTF 模型加载到 threejs 中。对象上使用的所有 Material (还有很多)都使用网格基础 Material ,我们希望它们是可以受光影响的 Material 。有没有办法将所
这是我第一次在这里发帖。我正在使用 python 制作房屋的 3D 模型,我想使用 FreeCAD 可视化输出。我找到了写入 dxf 格式的 ezdxf 接口(interface)(https://p
我想从点云生成视觉上吸引人的表面重建。 我正在使用点云库。我尝试使用泊松重建方法创建网格,但后来发现它提供了水密重建。 例如:在我的情况下,我有一个房间的点云 使用 http://justpaste.
我在 ogre3d 中使用了bulletphysics。为了让它们共享相同的顶点数据,我使用了这个: http://www.ogre3d.org/tikiwiki/BulletMeshStrider
我有一个从给定网格(形状)获取主曲率的问题。 我正在尝试使用 Matlab 文件交换中的“patchcurvature”方法。然而,该方法总是给出正曲率。我认为可能是该方法将网格视为单独的补丁,并计算
我正在寻找一种算法,该算法可以接收3d表面网格(即由3d三角形组成的一些流形的离散化)并在网格体积内生成四面体。 即,我想要与这个2d问题等效的3d:给定闭合曲线,对它的内部进行三角剖分。 很抱歉,如
我有一个包含彩色点云的 .ply 文件: 我需要将其转换为纹理网格。我可以创建一个空白网格: 过滤器 -> 点集 -> 表面重建:泊松 但结果是一个白色的网格 似乎所有关于颜色的信息都丢失了。有什么建
我有一个三角形网格类,其中包含一个节点列表(在我的情况下为 2d,但这无关紧要)和一个面列表。每个面都是一个三角形,它只包含节点数组的索引。网格来自 Delaunay 算法,因此非常干净。 对于网格中
我有一组点需要构建为一组三角形面以形成实体网格。我看过德劳内三角测量,但没有一个有意义。关于从哪里开始有什么建议吗?我不处理复杂的形状,它们最多包含 200 个顶点。 注意:这些点位于 x,y,z 空
我有一组点需要构建为一组三角形面以形成实体网格。我看过 Delaunay Triangulation,但没有任何意义。关于从哪里开始的任何建议?我不处理复杂的形状,它们最多包含 200 个顶点。 注意
最近我得到一个三角形网格,但是网格上三角形的法线方向是不一致。是否有任何算法可以使法线一致?从一本书中,它说“通常传播法线的方向沿着相邻补丁之间的最小生成树预处理步骤或隐含地遍历输入 [Hoppe等。
我正在用 Java3D 创建莫比乌斯带。我有一条缝,我似乎无法摆脱它!我假设它与法线有关,而且连接边之间的角度差在技术上是 180 度。谁能帮我去掉这个接缝? 这是我的代码: public c
比方说 data是一个大小为 129 * 129 的矩阵. 通过使用 mesh(data, 'FaceColor', 'none', 'EdgeColor', 'black') 我们得到类似的东西 我
网格和几何体之间有什么区别?它们不是一样的吗?即形成三角形的顶点的集合? 最佳答案 点是几何体,但它不是网格。曲线是几何体,但它不是网格。等值面是几何体,但它不是……现在您明白了。 网格是几何体,而不
我认为 OpenMesh 将支持对面边缘顶点的随机访问。我能找到的只是迭代器和循环器: for( auto v : mesh->vertices() ) mesh->point(v).data
我是一名优秀的程序员,十分优秀!