[英]How to set the size of an opengl object?
我必须在opengl中显示一个object(这是一个家庭作业),我在互联网上找到了一个很好的代码,但是显示的object的大小非常小,我不知道如何将它更改为更大的显示ZA8CFDE63311BD59EB2AC9C6B88尺寸。
我认为我必须修改 reshape、drawObject 和 display 函数,但我不知道 opengl 和它的函数,所以我不知道我应该修改哪部分代码。
#include<stdio.h>
#include"glut.h"
GLuint object;
float objectrot;
char ch = '1';
void loadObj(const char* fname)
{
FILE* fp;
int read;
GLfloat x, y, z;
char ch;
object = glGenLists(1);
fp = fopen(fname, "r");
if (!fp)
{
printf("can't open file %s\n", fname);
exit(1);
}
glPointSize(2.0);
glNewList(object, GL_COMPILE);
{
glPushMatrix();
glBegin(GL_POINTS);
while (!(feof(fp)))
{
read = fscanf(fp, "%c %f %f %f", &ch, &x, &y, &z);
if (read == 4 && ch == 'v')
{
glVertex3f(x, y, z);
}
}
glEnd();
}
glPopMatrix();
glEndList();
fclose(fp);
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, (GLfloat)w / (GLfloat)h, 0.1, 1000.0);
glMatrixMode(GL_MODELVIEW);
}
void drawObject()
{
glPushMatrix();
glTranslatef(0, -40.00, -105);
glColor3f(255, 255, 255);
glScalef(0.1, 0.1, 0.1);
glRotatef(objectrot, 0, 1, 0);
glCallList(object);
glPopMatrix();
objectrot += 0.001;
if (objectrot > 360)objectrot -= 360;
}
void display(void)
{
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
drawObject();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 450);
glutInitWindowPosition(20, 20);
glutCreateWindow("ObjLoader");
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutIdleFunc(display);
loadObj("cat.obj");
glutMainLoop();
return 0;
}
我希望 window 中有更大的 object,但它非常小
您需要增加比例因子。
void drawObject()
{
glPushMatrix();
glTranslatef(0, -40.00, -105);
glColor3f(255, 255, 255);
glScalef(1.0, 1.0, 1.0);
glRotatef(objectrot, 0, 1, 0);
glCallList(object);
glPopMatrix();
objectrot += 0.001;
if (objectrot > 360)objectrot -= 360;
}
您应该将更大的数字传递给glScalef()
。 试试 1.0 看看是否可行。
将传入的几何图形居中并将其缩放到已知/固定大小,然后适当地设置您的查看变换:
// return the min/max points of pts
template< typename Vec >
std::pair< Vec, Vec > GetExtents( const Vec* pts, size_t stride, size_t count )
{
unsigned char* base = (unsigned char*)pts;
Vec pmin( *(Vec*)base );
Vec pmax( *(Vec*)base );
for( size_t i = 0; i < count; ++i, base += stride )
{
const Vec& pt = *(Vec*)base;
pmin = glm::min( pmin, pt );
pmax = glm::max( pmax, pt );
}
return std::make_pair( pmin, pmax );
}
// centers geometry around the origin
// and scales it to fit in a size^3 box
template< typename Vec >
void CenterAndScale( Vec* pts, size_t stride, size_t count, const typename Vec::value_type& size )
{
typedef typename Vec::value_type Scalar;
// get min/max extents
std::pair< Vec, Vec > exts = GetExtents( pts, stride, count );
// center and scale
const Vec center = ( exts.first * Scalar( 0.5 ) ) + ( exts.second * Scalar( 0.5f ) );
const Scalar factor = size / glm::compMax( exts.second - exts.first );
unsigned char* base = (unsigned char*)pts;
for( size_t i = 0; i < count; ++i, base += stride )
{
Vec& pt = *(Vec*)base;
pt = ( ( pt - center ) * factor );
}
}
用法示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.