概述
看一些文章,球纹理图好象是用全景图转换来的。
用手机拍摄一组图试试:
然后用用ps中的photomerge拼接成:
再去掉两头重合部分:
直接载入前面的程序中也是可以的,显示在球外视角:
如果用右键向缩小方向拉,图像缩小后反向放大,视角就会进入球内部。
不过效果不是很好,为了更好的显示,重新修改下cpp:
不过效果不是很好,为了更好的显示,重新修改下cpp:
//52 全景球贴图
//左键(+ 移动)旋转,右键(+ 移动)缩放 1,2,3,4 切换地图,回车键(enter)全屏切换
#pragma comment( lib, "opengl32.lib" )
#pragma comment( lib, "glut32.lib")
#include <GL/glut.h>
#include <GL/glu.h>
#include <math.h>
#include "ArcBall.h"
#include "Sky.h"
CSky m_sky;
int BuildTexture(char *szPathName, GLuint &texid);
//初始化,必须用全局变量的方式,不能用new
ArcBallT arcBall(600.0f,400.0f);
ArcBallT* ArcBall =&arcBall;// new ArcBallT(600.0f,400.0f);//&arcBall;
GLuint SkyTexture[10];//纹理
int width,height;//屏幕宽高
void reshape(int w, int h){
glViewport(0,0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(70.0f, (GLfloat)w / (GLfloat)h, 6.5f, 150.0f);
glMatrixMode(GL_MODELVIEW);
ball
ArcBall->setBounds((GLfloat)w, (GLfloat)h);//1. 设置窗口边界
}
void init(){
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);
/* 初始化天空 */
//载入天空纹理图 //请放到一起(和其它图)
BuildTexture("m1.jpg",SkyTexture[0]);//塔下全景图
BuildTexture("map3.jpg",SkyTexture[3]);//航空图
BuildTexture("map5.jpg",SkyTexture[1]);//英文世界地图
BuildTexture("world3.jpg",SkyTexture[2]);//航空航海图
int R=105;//地图球半径
m_sky.InitSky(0,0,0,R,SkyTexture[0]);//初始化天空球
}
void display (void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glLoadIdentity();
gluLookAt(0.0, 0.0, 6.0,//m_sky.GetSkyR()*ArcBall->zoomRate+5.0,//视点跟踪球大小
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
//glTranslatef(0,0,-3);
glScalef(-ArcBall->zoomRate, -ArcBall->zoomRate, -ArcBall->zoomRate);//2. 缩放
glMultMatrixf(ArcBall->Transform.M); //3. 旋转
//起始位置转到我国
//glRotatef(180, 1.0, 0.0, 0.0);
//glRotatef(105, 0.0, 1.0, 0.0);
/* 绘制天空 */
m_sky.ShowSky() ;
glFlush ();
}
//移动
void move(int x, int y)
{
ArcBall->MousePt.s.X = x;
ArcBall->MousePt.s.Y = y;
ArcBall->upstate();
glutPostRedisplay();
}
//点击
void mouse(int button, int state, int x, int y)
{
if(button == GLUT_LEFT_BUTTON && state==GLUT_DOWN){
ArcBall->isClicked = true;
move(x,y);
}
else if(button == GLUT_LEFT_BUTTON && state==GLUT_UP)
ArcBall->isClicked = false;
else if(button == GLUT_RIGHT_BUTTON && state==GLUT_DOWN){
ArcBall->isRClicked = true;
move(x,y);
}
else if(button == GLUT_RIGHT_BUTTON && state == GLUT_UP)
ArcBall->isRClicked = false;
ArcBall->upstate();
glutPostRedisplay();
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
break;
case '1':
m_sky.T=SkyTexture[1];
break;
case '2':
m_sky.T=SkyTexture[2];
break;
case '3':
m_sky.T=SkyTexture[3];
break;
case '4':
m_sky.T=SkyTexture[0];
break;
case 13://按回车切换全屏
{
static bool full=false;
if (full)
{
glutReshapeWindow(width,height);//窗口
full=false;
}
else
{
glutFullScreen();//全屏
full=true;
}
}
break;
}
glutPostRedisplay();
//printf("key::%dn", key);
}
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(width=1200,height=640);
glutCreateWindow("HI");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse); //注册鼠标事件。
glutMotionFunc(move); //注册移动事件
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
效果图:
最后
以上就是笑点低手机为你收集整理的全景图--球贴图的全部内容,希望文章能够帮你解决全景图--球贴图所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复