3ds模型--流动的云

在“Pudn.com > 下载中心  > OpenGL  > Sky”中找来Sky.h 和Sky.cpp 这个叫天空球,或叫天空穹,顶的代码

把它加到我们的场景中,为了匹配我们的程序,部分代码需要修改.

修改后的Sky.h:

// Sky.h:  CSky 类接口. 
// 
// 
 
#if !defined(AFX_SKY_H__F6C8078A_2217_4F98_BD37_F5F00D2F3E16__INCLUDED_) 
#define AFX_SKY_H__F6C8078A_2217_4F98_BD37_F5F00D2F3E16__INCLUDED_ 
 
#include<gl/glut.h>
#include<gl/glu.h>
#include<gl/gl.h>

#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
 
class CSky   
{ 
public: 
	CSky(); 
	virtual ~CSky(); 
	float X; 
	float Y; 
	float Z; 
	float R; 
	unsigned int T; 
	GLUquadricObj *qobj; 
 
	//初始化天空的位置,半径和纹理 
	void InitSky(float skyX,float skyY,float skyZ,float skyR,unsigned int texture); 
	//显示天空 
	void ShowSky(void); 
	//获得天空的属性 
	float GetSkyX(void); 
	float GetSkyY(void); 
	float GetSkyZ(void); 
	float GetSkyR(void); 
	unsigned int GetSkyTexture(void); 
 
 
}; 
 
#endif // !defined(AFX_SKY_H__F6C8078A_2217_4F98_BD37_F5F00D2F3E16__INCLUDED_) 

 

修改后的Sky.cpp:

// Sky.cpp: CSky类的实现。  
//   
//   
   
#include "Sky.h"   
   
//   
// 建造/销毁   
//   
   
CSky::CSky()   
{   
    X = 0;   
    Y = 0;   
    Z = 0;   
    R = 100;   
   
}   
   
CSky::~CSky()   
{   
   
}   
void CSky::InitSky(float skyX,float skyY,float skyZ,float skyR,unsigned int texture)   
{   
    X = skyX;   
    Y = skyY;   
    Z = skyZ;   
    R = skyR;   
    T = texture;   
    //   
    qobj = gluNewQuadric();   
	gluQuadricDrawStyle(qobj, GLU_FILL);  
    gluQuadricNormals(qobj,GLU_SMOOTH);   // //GLU_NONE
    gluQuadricTexture(qobj,GL_TRUE);   //GL_FALSE
}   
   
void CSky::ShowSky()   
{   
    static float r=0.0;   
    r+=0.8;   
   /* 获得场景中光照状态 */
    GLboolean lp;
    glGetBooleanv(GL_LIGHTING,&lp);
    glDisable(GL_LIGHTING);            /*< 关闭光照 */

    glPushMatrix();   
    glBindTexture(GL_TEXTURE_2D, T);   
    //glTranslatef(X,Y,Z);    
    glRotatef(r,0.0f,1.0f,0.0f); //天空慢慢旋转,模拟云流动   
    glRotatef(90,1,0,0);   
    glColor4f(1,1,1,1);   
    gluSphere(qobj,R,32,32);   
    glPopMatrix();   

    if(lp)                         /* 恢复光照状态 */  
        glEnable(GL_LIGHTING);
}   
   
float CSky::GetSkyR()   
{   
    return R;   
}   
float CSky::GetSkyX()   
{   
    return X;   
}   
float CSky::GetSkyY()   
{   
    return Y;   
}   
float CSky::GetSkyZ()   
{   
    return Z;   
}   
   
   

 

我们的主cpp也稍修改:

//49 天空顶 + 场景漫游 + + 

#include <stdio.h>
//1,主程序:
#include<gl/glut.h>
#include<gl/glu.h>
#include<gl/gl.h>

#include "motionModel.h"

#include "Camera.h"
#include "Sky.h"
//#include "SkyBox.h"

/** 定义光源的属性值 */
GLfloat LightAmbient[] = { 0.5f, 0.5f, 0.5f, 1.0f };    /**< 环境光参数 */
GLfloat LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };    /**< 漫射光参数 */
GLfloat LightSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };   /**< 镜面光参数 */
GLfloat LightPosition[] = { 0.0f, 0.0f, 2.0f, 1.0f };   /**< 光源位置 */

Camera m_Camera;
//CSkyBox m_SkyBox;
CSky m_sky;

int BuildTexture(char *szPathName, GLuint &texid);

void init(void)
{
    /* 用户自定义的初始化过程 */
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    glClearDepth(1.0f);
    glDepthFunc(GL_LEQUAL);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_SMOOTH);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

    /* 启用纹理 */
    glEnable(GL_TEXTURE_2D);


	ModelInit();


    /* 初始化天空 */
	//载入天空纹理图
	GLuint SkyTexture;
	BuildTexture("sky.jpg",SkyTexture);//请放到一起(和其它图)
    m_sky.InitSky(0,0,0,100,SkyTexture);//初始化天空球
	    
    /** 设置光源的属性值 */
    glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);     /**< 设置环境光 */
    glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);     /**< 设置漫射光 */
    glLightfv(GL_LIGHT1, GL_SPECULAR, LightSpecular);   /**< 设置漫射光 */
    glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);   /**< 设置光源位置 */

	glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT1);


    /* 设置摄像机 */
    m_Camera.setCamera(500, 35, 400, 501, 35, 400, 0, 1, 0);

	m_Camera.setViewByMouse();

}


void display(void)
{
    /* 用户自定义的绘制过程 */
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    /* 放置摄像机 */
    m_Camera.setLook();

    glPushAttrib(GL_CURRENT_BIT);   /**< 保存当前属性 */
	glPushMatrix();

	//由于相对于天空盒所以要加以平移和缩放
    glTranslatef(600.0f, 22.0f, 600.0f);//平移:表示将当前图形向x轴平移5,向y轴平移-2,向z轴平移-10
    glScalef(12.0f, 12.0f, 12.0f);//缩放:表示将当前图形沿x,y,z轴分别放大为原来的12倍
    /* 绘制天空 */
	m_sky.ShowSky() ;	
	drawAllModel();//绘制所有模型

    glPopMatrix();
    glPopAttrib();

    glFlush();                   /*< 强制执行所有的OpenGL命令 */
}

void ChangeSize(int width, int height)
{
    glViewport(0, 0, width, height);                                    /*< 重新设置视口 */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 4000.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void motion(int x, int y)
{
    m_Camera.setViewByMouse();

    glutPostRedisplay();
}

void keyboard(unsigned char key, int x, int y)
{
    switch (key) {
        case 27:
            exit(0);
            break;
        case '1':
            m_Camera.setSpeed(0.2f);
            break;
        case '2':
            m_Camera.setSpeed(1.0f);
            break;
        case 'w':
            m_Camera.moveCamera(m_Camera.getSpeed());
            break;
        case 's':
            m_Camera.moveCamera(-m_Camera.getSpeed());
            break;
        case 'a':
            m_Camera.yawCamera(-m_Camera.getSpeed());
            break;
        case 'd':
            m_Camera.yawCamera(m_Camera.getSpeed());
            break;
    }

    glutPostRedisplay();
    printf("key::%d\n", key);
}

void SpinDisplay()
{
	glutPostRedisplay();
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB);
    glutInitWindowSize(800, 600);
    glutInitWindowPosition((GetSystemMetrics(SM_CXSCREEN) >> 1) - 400, (GetSystemMetrics(SM_CYSCREEN) >> 1) - 300);
    glutCreateWindow("天空盒");
    init();
    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(display);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);
	glutIdleFunc( SpinDisplay );//注册旋转
    glutMainLoop();
    return 0;
}

效果图:


天空纹理图:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算疫情扩散时间是指在给定的传播速率和人群密集程度下,疫情从一个起始点传播到整个人群的所需时间。 首先,需要确定一些变量。传播速率可以通过统计数据和模型进行估计,可以考虑使用每个感染者每天传播的人数作为传播速率参数。人群密集程度可以通过城市人口数量、人口流动性等指标来衡量。 接下来,利用传播模型来计算疫情扩散时间。流行病学中常用的传播模型之一是SIR模型,其中S代表易感者,I代表感染者,R代表康复或免疫者。SIR模型的核心是基本再生数R0,它表示每个感染者在人群中平均传播的次数。根据R0和人群密集程度,可以计算出每个感染者每天传播的人数。 以一般形式的SIR方程为例: dS/dt = -βSI dI/dt = βSI - γI dR/dt = γI 其中β是传染率,γ是康复率。根据模型参数,可以通过数值计算的方式求解这组微分方程,并得到感染者人数随时间的变化。 最后,计算疫情扩散时间。可以从初始感染者开始,设置相应的初始条件,并进行计算,当感染者人数接近人群总数或者达到一定阈值时,认为疫情已经扩散到整个人群。通过统计模型得到的感染者人数随时间的变化情况,可以得到疫情扩散所需的时间。 需要注意的是,以上仅是简单的计算方法,实际情况会更加复杂。因为人群行为和政府的干预措施会对疫情传播产生重要影响,所以在计算疫情扩散时间时需要考虑这些因素,例如隔离措施、个人行为等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值