opengl c++求大神知道为什么我的光总是不能照到我的物体上啊!

weixin_41288181 2018-11-17 03:27:51
先放上运行图,可以看到正面看时比较暗,但是从上往下看时能感觉到地面是被照亮的,我怎么改lightposition的坐标都没用,求大佬指点!



下面放上源码
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#include<gl/glaux.h>
#include <math.h>
#include <time.h>

#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glut32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glut.lib")
#pragma comment(lib, "glaux.lib")
#pragma comment(lib,"legacy_stdio_definitions.lib")


int WinWidth, WinHeight;
double posX, posY, posZ, viewX, viewY, viewZ, upX, upY, upZ;
const GLfloat PI = 3.141515926;
int use = 0;
GLfloat xRot = 0.0f;
GLfloat yRot = 0.0f;
UINT ground, box,box1;
const char* aa = "E://3up/box.bmp";
const char* bb = "E://3up/ground2.bmp";
const char* cc = "E://3up/box1.bmp";
const char* dd = "E://3up/dd.bmp";
const char* ee = "E://3up/ground1.bmp";
int light = 1;
bool r = true;
bool ct = true;


void setUpRc() {
GLfloat LightAmbient[] = { 0.0f,0.0f,0.0f,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, 30.0f,5.0f,1.0f }; //光源位置

glPushMatrix();
glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT1, GL_SPECULAR, LightSpecular);
glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
glPopMatrix();
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT1);

//glFrontFace(GL_CW);
glEnable(GL_DEPTH_TEST);




}
void setAll(double px, double py, double pz,
double vx, double vy, double vz,
double ux, double uy, double uz)
{
posX = px;
posY = py;
posZ = pz;
viewX = vx;
viewY = vy;
viewZ = vz;
upX = ux;
upY = uy;
upZ = uz;
}

void setLookAt() {
gluLookAt(posX, posY, posZ,
viewX, viewY, viewZ,
upX, upY, upZ);
glPushMatrix();
}

void setPos(double x, double y, double z) {
posX = x;
posY = y;
posZ = z;
}

void DisplayBox1() {


float x, y, z;
glPushMatrix();

glScalef(x=4, y=4, z=4);

glEnable(GL_TEXTURE_2D); //贴图有效
glRotatef(xRot, 0.0f, 3.0f, 0.0f);
glBindTexture(GL_TEXTURE_2D, box);
GLfloat ambient[] = { 0.3f,0.2f,0.0f,1.0f, };
GLfloat diffuse[] = { 0.8f,0.6f,0.1f,1.0f, };
GLfloat specular[] = { 1.0f,1.0f,0.8f,1.0f, };

glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
glMaterialf(GL_FRONT, GL_SHININESS, 50.0);
//glMateriali(GL_FRONT, GL_SHININESS, 128);
glBegin(GL_QUADS);

glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);// 前
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 3.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 3.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -1.0f);// 后
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 3.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f,3.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 3.0f, -1.0f);// 上
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 3.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 3.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 3.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);// 下
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, -1.0f);// 左
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 3.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 3.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -1.0f);// 右
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 3.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 3.0f, -1.0f);

glEnd();

glDisable(GL_TEXTURE_2D);//取消贴图

glPopMatrix();


}

void DisplayBox2() {


float x, y, z;
glPushMatrix();

glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);


glPushMatrix();
glScalef(x = 2, y = 2, z = 2);
glEnable(GL_TEXTURE_2D); //贴图有效
glRotatef(yRot, 0.0f, 3.0f, 0.0f);
glBindTexture(GL_TEXTURE_2D, box1);

GLfloat ambient[] = { 0.2f,0.2f,0.1f,1.0f, };
GLfloat diffuse[] = { 0.3f,0.3f,0.1f,1.0f, };
GLfloat specular[] = { 0.8f,0.7f,0.2f,1.0f, };

glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
glMaterialf(GL_FRONT, GL_SHININESS, 80.0);
glBegin(GL_QUADS);

glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 8.0f, 1.0f);// 前
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 8.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 10.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 10.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 8.0f, -1.0f);// 后
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 10.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 10.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 8.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 10.0f, -1.0f);// 上
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 10.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 10.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 10.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 8.0f, -1.0f);// 下
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 8.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 8.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 8.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 8.0f, -1.0f);// 左
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 10.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 10.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 8.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 8.0f, -1.0f);// 右
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 8.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 10.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 10.0f, -1.0f);

glEnd();

glDisable(GL_TEXTURE_2D);//取消贴图

glPopMatrix();



}
void Ground() {

glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glBindTexture(GL_TEXTURE_2D, ground);
GLfloat ambient[] = { 0.2f,0.2f,0.2f,1.0f, };
GLfloat diffuse[] = { 0.2f,0.2f,0.2f,1.0f, };
GLfloat specular[] = { 0.5f,0.5f,0.5f,1.0f, };

glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
glMaterialf(GL_FRONT, GL_SHININESS, 5.0);
glBegin(GL_QUADS);
glNormal3f(0.0f, 1.0f, 0.0f);
for (int z = 0; z < 20; z++) {
float zStart = 100.0f - z * 10.0f;
for (int x = 0; x < 20; x++) {
float xStart = x * 10.0f - 100.0f;
glColor4ub(200, 200, 200, 255);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(xStart, -1.0f, zStart);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(xStart + 10.0f, -1.0f, zStart);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(xStart + 10.0f, -1.0f, zStart - 10.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(xStart, -1.0f, zStart - 10.0f);
}
}
glEnd();
glDisable(GL_TEXTURE_2D);

}
bool LoadTexture(char *filename, GLuint &texture) {
AUX_RGBImageRec *pImage = auxDIBImageLoadA(filename);
if (pImage == NULL) return false;
glGenTextures(1, &texture);

glBindTexture(GL_TEXTURE_2D, texture);
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, pImage->sizeX, pImage->sizeY, GL_RGB, GL_UNSIGNED_BYTE, pImage->data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
return true;

}




void Display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Ground();
DisplayBox1();
DisplayBox2();
glutSwapBuffers();
}

void update() {
glLoadIdentity();
setLookAt();
glutPostRedisplay();
}

void TimerFunc(int value)
{
static double delta;
switch (value) {
case 0:

if (r == true) {
xRot -= 1.0f;
yRot += 1.0f;
glutTimerFunc(20, TimerFunc, 0);
glutPostRedisplay();
}
else;

break;
case 1:
xRot += 1.0f;
yRot -= 1.0f;
glutPostRedisplay();
glutTimerFunc(20, TimerFunc, 1);
break;



}


}


void init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
char* id1 = const_cast<char*>(aa);
char* id2 = const_cast<char*>(bb);
char* id3 = const_cast<char*>(cc);
char* id4 = const_cast<char*>(dd);
char* id5 = const_cast<char*>(ee);
if (ct == true) {
LoadTexture(id1, box);
LoadTexture(id2, ground);
}
else {
LoadTexture(id4, box);
LoadTexture(id5, ground);
}

LoadTexture(id3, box1);
setAll(20, 20, 10, 0, 11, 0, 0, 5, 0);

//glPushMatrix();
//glLoadIdentity();



}

void ProcessKeyBoard(int key, int x, int y) {
static double delta;
if (key == GLUT_KEY_LEFT) {
delta += 0.03;
setPos(20 * cos(delta), posY, 20 * sin(delta));
glPushMatrix();
}
else if (key == GLUT_KEY_RIGHT) {
delta -= 0.03;
setPos(20 * cos(delta), posY, 20 * sin(delta));
glPushMatrix();
}
else if (key == GLUT_KEY_UP) {
delta += 0.03;
setPos(20 * cos(delta), 40 * sin(delta), posZ);
glPushMatrix();
}
else if (key == GLUT_KEY_DOWN) {
delta -= 0.03;
setPos(20 * cos(delta), 40 * sin(delta), posZ);
glPushMatrix();
}
else if (key == GLUT_KEY_F1) {
r = true;
//TimerFunc(0);
glutTimerFunc(20, TimerFunc, 0);
}
else if (key == GLUT_KEY_F2) {
r = false;
TimerFunc(0);
}
else if (key == GLUT_KEY_F3) {
if (light)
{
light = 0;
glDisable(GL_LIGHTING);
printf("off\n");
}
else
{
light = 1;
glEnable(GL_LIGHTING);
printf("on\n");
}
}
else if (key == GLUT_KEY_F4) {
ct = false;
init();

}
else if (key == GLUT_KEY_F5) {
ct = true;
init();

}
}

void myMouse(int button, int state, int x, int y) {
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {

glMatrixMode(GL_PR
...全文
28 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
丁劲犇 2018-11-18
  • 打赏
  • 举报
回复
背景的砖头有光线,不是很懂这一块
赵4老师 2018-11-17
  • 打赏
  • 举报
回复
搜网络教程“学OpenGL编3D游戏”

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧