blobt
5 years ago
48 changed files with 2006 additions and 0 deletions
-
6.gitignore
-
BINRes/back.bmp
-
BINRes/bottom.bmp
-
12Res/chair.mtl
-
BINRes/earth.bmp
-
BINRes/front.bmp
-
26Res/ground.fs
-
16Res/ground.vs
-
BINRes/head.png
-
BINRes/left.bmp
-
56Res/model.fs
-
17Res/model.vs
-
BINRes/niutou.bmp
-
9Res/particle.fs
-
14Res/particle.vs
-
BINRes/right.bmp
-
9Res/skybox.fs
-
11Res/skybox.vs
-
BINRes/test.bmp
-
7Res/texture.fs
-
9Res/texture.vs
-
BINRes/top.bmp
-
106camera.cpp
-
16camera.h
-
13ggl.h
-
58ground.cpp
-
13ground.h
-
96light.cpp
-
38light.h
-
167main.cpp
-
193model.cpp
-
27model.h
-
BINopengl.VC.db
-
BINopengl.aps
-
BINopengl.rc
-
28opengl.sln
-
173opengl.vcxproj
-
83opengl.vcxproj.filters
-
6opengl.vcxproj.user
-
14resource.h
-
506scene.cpp
-
8scene.h
-
100skybox.cpp
-
11skybox.h
-
79utils.cpp
-
9utils.h
-
53vector3.cpp
-
17vector3.h
@ -0,0 +1,12 @@ |
|||
# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware |
|||
# 创建的文件:02.04.2020 16:02:29 |
|||
|
|||
newmtl wire_086086086 |
|||
Ns 32 |
|||
d 1 |
|||
Tr 0 |
|||
Tf 1 1 1 |
|||
illum 2 |
|||
Ka 0.0000 0.0000 0.0000 |
|||
Kd 0.3373 0.3373 0.3373 |
|||
Ks 0.3500 0.3500 0.3500 |
@ -0,0 +1,26 @@ |
|||
#ifdef GL_ES |
|||
precision mediump float; |
|||
#endif |
|||
varying vec4 V_Color; |
|||
varying vec3 V_Normal; |
|||
varying vec3 V_WorldPos; |
|||
vec4 GetPointLight() |
|||
{ |
|||
float distance=0.0; |
|||
float constantFactor=1.0; |
|||
float linearFactor=0.0; |
|||
float quadricFactor=0.0; |
|||
vec4 ambientColor=vec4(1.0,1.0,1.0,1.0)*vec4(0.1,0.1,0.1,1.0); |
|||
vec3 L=vec3(0.0,1.0,0.0)-V_WorldPos; |
|||
distance=length(L); |
|||
float attenuation=1.0/(constantFactor+linearFactor*distance+quadricFactor*quadricFactor*distance); |
|||
L=normalize(L); |
|||
vec3 n=normalize(V_Normal); |
|||
float diffuseIntensity=max(0.0,dot(L,n)); |
|||
vec4 diffuseColor=vec4(1.0,1.0,1.0,1.0)*vec4(0.1,0.4,0.6,1.0)*diffuseIntensity*attenuation; |
|||
return ambientColor+diffuseColor; |
|||
} |
|||
void main() |
|||
{ |
|||
gl_FragColor=V_Color*GetPointLight(); |
|||
} |
@ -0,0 +1,16 @@ |
|||
attribute vec4 position; |
|||
attribute vec4 color; |
|||
attribute vec4 normal; |
|||
uniform mat4 ModelMatrix; |
|||
uniform mat4 ViewMatrix; |
|||
uniform mat4 ProjectionMatrix; |
|||
varying vec4 V_Color; |
|||
varying vec3 V_Normal; |
|||
varying vec3 V_WorldPos; |
|||
void main() |
|||
{ |
|||
V_Color=color; |
|||
V_Normal=normal.xyz; |
|||
V_WorldPos=(ModelMatrix*position).xyz; |
|||
gl_Position=ProjectionMatrix*ViewMatrix*ModelMatrix*position; |
|||
} |
After Width: 108 | Height: 108 | Size: 28 KiB |
@ -0,0 +1,56 @@ |
|||
#ifdef GL_ES |
|||
precision mediump float; |
|||
#endif |
|||
uniform sampler2D U_Texture; |
|||
uniform vec4 U_LightPos; |
|||
uniform vec4 U_LightAmbient; |
|||
uniform vec4 U_LightDiffuse; |
|||
uniform vec4 U_LightSpecular; |
|||
uniform vec4 U_AmbientMaterial; |
|||
uniform vec4 U_DiffuseMaterial; |
|||
uniform vec4 U_SpecularMaterial; |
|||
uniform vec4 U_CameraPos; |
|||
uniform vec4 U_LightOpt; |
|||
varying vec4 V_Texcoord; |
|||
varying vec4 V_WorldPos; |
|||
varying vec4 V_Normal; |
|||
|
|||
vec4 GetPointLight() |
|||
{ |
|||
float distance=0.0; |
|||
float constantFactor=1.0; |
|||
float linearFactor=0.0; |
|||
float quadricFactor=0.0; |
|||
vec4 ambientColor=vec4(1.0,1.0,1.0,1.0)*vec4(0.1,0.1,0.1,1.0); |
|||
vec3 L=vec3(0.0,1.0,0.0)-V_WorldPos.xyz; |
|||
distance=length(L); |
|||
float attenuation=1.0/(constantFactor+linearFactor*distance+quadricFactor*quadricFactor*distance); |
|||
L=normalize(L); |
|||
vec3 n=normalize(V_Normal.xyz); |
|||
float diffuseIntensity=max(0.0,dot(L,n)); |
|||
vec4 diffuseColor=vec4(1.0,1.0,1.0,1.0)*vec4(0.1,0.4,0.6,1.0)*diffuseIntensity*attenuation; |
|||
return ambientColor+diffuseColor; |
|||
} |
|||
void main() |
|||
{ |
|||
vec4 ambientColor=U_LightAmbient*U_AmbientMaterial; |
|||
vec3 lightPos=U_LightPos.xyz; |
|||
vec3 L=lightPos; |
|||
L=normalize(L); |
|||
vec3 n=normalize(V_Normal.xyz); |
|||
float diffuseIntensity=max(0.0,dot(L,n)); |
|||
vec4 diffuseColor=U_LightDiffuse*U_DiffuseMaterial*diffuseIntensity; |
|||
vec4 specularColor=vec4(0.0,0.0,0.0,0.0); |
|||
if(diffuseIntensity!=0.0){ |
|||
vec3 reflectDir=normalize(reflect(-L,n)); |
|||
vec3 viewDir=normalize(U_CameraPos.xyz-V_WorldPos.xyz); |
|||
specularColor=U_LightSpecular*U_SpecularMaterial*pow(max(0.0,dot(viewDir,reflectDir)),U_LightOpt.x); |
|||
} |
|||
if(U_LightOpt.y==1.0){ |
|||
gl_FragColor=(ambientColor+diffuseColor)*texture2D(U_Texture,V_Texcoord.xy)+specularColor; |
|||
}else if(U_LightOpt.z==1.0){ |
|||
gl_FragColor=(ambientColor+diffuseColor+GetPointLight())*texture2D(U_Texture,V_Texcoord.xy); |
|||
}else if(U_LightOpt.w==1.0){ |
|||
gl_FragColor=ambientColor+diffuseColor+specularColor; |
|||
} |
|||
} |
@ -0,0 +1,17 @@ |
|||
attribute vec4 position; |
|||
attribute vec4 texcoord; |
|||
attribute vec4 normal; |
|||
uniform mat4 ModelMatrix; |
|||
uniform mat4 IT_ModelMatrix; |
|||
uniform mat4 ViewMatrix; |
|||
uniform mat4 ProjectionMatrix; |
|||
varying vec4 V_Texcoord; |
|||
varying vec4 V_WorldPos; |
|||
varying vec4 V_Normal; |
|||
void main() |
|||
{ |
|||
V_Texcoord=texcoord; |
|||
V_Normal=IT_ModelMatrix*normal; |
|||
V_WorldPos=ModelMatrix*position; |
|||
gl_Position=ProjectionMatrix*ViewMatrix*V_WorldPos; |
|||
} |
@ -0,0 +1,9 @@ |
|||
#ifdef GL_ES |
|||
precision mediump float; |
|||
#endif |
|||
uniform sampler2D U_Texture; |
|||
varying vec4 V_Color; |
|||
void main() |
|||
{ |
|||
gl_FragColor=texture2D(U_Texture,gl_PointCoord.xy)*V_Color; |
|||
} |
@ -0,0 +1,14 @@ |
|||
attribute vec4 position; |
|||
attribute vec4 color; |
|||
attribute vec4 normal; |
|||
uniform mat4 ModelMatrix; |
|||
uniform mat4 ViewMatrix; |
|||
uniform mat4 ProjectionMatrix; |
|||
varying vec4 V_Color; |
|||
void main() |
|||
{ |
|||
V_Color=color; |
|||
gl_PointSize=64.0; |
|||
vec4 pos=vec4(position.x+normal.x,position.y+normal.y,position.z+normal.z,1.0); |
|||
gl_Position=ProjectionMatrix*ViewMatrix*ModelMatrix*pos; |
|||
} |
@ -0,0 +1,9 @@ |
|||
#ifdef GL_ES |
|||
precision mediump float; |
|||
#endif |
|||
uniform sampler2D U_Texture; |
|||
varying vec4 V_Texcoord; |
|||
void main() |
|||
{ |
|||
gl_FragColor=texture2D(U_Texture,V_Texcoord.xy); |
|||
} |
@ -0,0 +1,11 @@ |
|||
attribute vec4 position; |
|||
attribute vec4 texcoord; |
|||
uniform mat4 ModelMatrix; |
|||
uniform mat4 ViewMatrix; |
|||
uniform mat4 ProjectionMatrix; |
|||
varying vec4 V_Texcoord; |
|||
void main() |
|||
{ |
|||
V_Texcoord=texcoord; |
|||
gl_Position=ProjectionMatrix*ViewMatrix*ModelMatrix*position; |
|||
} |
@ -0,0 +1,7 @@ |
|||
#ifdef GL_ES |
|||
precision mediump float; |
|||
#endif |
|||
void main() |
|||
{ |
|||
gl_FragColor=vec4(1.0,1.0,1.0,1.0); |
|||
} |
@ -0,0 +1,9 @@ |
|||
attribute vec4 position; |
|||
uniform mat4 ModelMatrix; |
|||
uniform mat4 ViewMatrix; |
|||
uniform mat4 ProjectionMatrix; |
|||
|
|||
void main() |
|||
{ |
|||
gl_Position=ProjectionMatrix*ViewMatrix*ModelMatrix*position; |
|||
} |
@ -0,0 +1,106 @@ |
|||
#include "camera.h"
|
|||
|
|||
Camera::Camera() : mPos(0.0f,0.0f,0.0f),mViewCenter(0.0f,0.0f,-1.0f),mUp(0.0f,1.0f,0.0f) |
|||
{ |
|||
mbMoveLeft = false; |
|||
mbMoveRight = false; |
|||
mbMoveForward = false; |
|||
mbMoveBack = false; |
|||
} |
|||
|
|||
void Camera::Update(float deltaTime) |
|||
{ |
|||
float moveSpeed = 10.0f; |
|||
|
|||
//Ç°·½µÄÏòÁ¿
|
|||
Vector3f forwardDirection = mViewCenter - mPos; |
|||
forwardDirection.Normalize(); |
|||
|
|||
//ÓÒ·½µÄÏòÁ¿
|
|||
Vector3f rightDirection = Cross(forwardDirection, mUp); |
|||
rightDirection.Normalize(); |
|||
|
|||
if (mbMoveLeft) { |
|||
Vector3f delta = rightDirection * deltaTime * moveSpeed; |
|||
mPos = mPos - delta; |
|||
mViewCenter = mViewCenter - delta; |
|||
} |
|||
|
|||
if (mbMoveRight) { |
|||
Vector3f delta = rightDirection * deltaTime * moveSpeed; |
|||
mPos = mPos + delta; |
|||
mViewCenter = mViewCenter + delta; |
|||
} |
|||
|
|||
if (mbMoveForward) { |
|||
Vector3f delta = forwardDirection * deltaTime * moveSpeed; |
|||
mPos = mPos + delta; |
|||
mViewCenter = mViewCenter + delta; |
|||
} |
|||
|
|||
if (mbMoveBack) { |
|||
Vector3f delta = forwardDirection * deltaTime * moveSpeed; |
|||
mPos = mPos - delta; |
|||
mViewCenter = mViewCenter - delta; |
|||
} |
|||
|
|||
glLoadIdentity(); |
|||
gluLookAt( |
|||
mPos.x, mPos.y, mPos.z, |
|||
mViewCenter.x, mViewCenter.y, mViewCenter.z, |
|||
mUp.x, mUp.y, mUp.z |
|||
); |
|||
|
|||
} |
|||
|
|||
void Camera::Picth(float angle) |
|||
{ |
|||
Vector3f viewDirection = mViewCenter - mPos; |
|||
viewDirection.Normalize(); |
|||
Vector3f rightDirection = Cross(viewDirection, mUp); |
|||
rightDirection.Normalize(); |
|||
RotateView(angle, rightDirection.x, rightDirection.y, rightDirection.z); |
|||
} |
|||
|
|||
void Camera::Yaw(float angle) |
|||
{ |
|||
RotateView(angle, mUp.x, mUp.y, mUp.z); |
|||
} |
|||
|
|||
void Camera::RotateView(float angle, float x, float y, float z) |
|||
{ |
|||
Vector3f viewDirection = mViewCenter - mPos; |
|||
Vector3f newDirection(0.0f, 0.0f, 0.0f); |
|||
|
|||
float C = cosf(angle); |
|||
float S = sinf(angle); |
|||
|
|||
Vector3f tempX(C + x*x*(1-C), x*y*(1-C)-z*S,x*z*(1-C)+y*S); |
|||
newDirection.x = tempX*viewDirection; |
|||
|
|||
Vector3f tempY(x*y*(1-C)+z*S, C+y*y*(1-C),y*z*(1-C)-x*S); |
|||
newDirection.y = tempY * viewDirection; |
|||
|
|||
Vector3f tempZ(x*z*(1-C)-y*S, y*z*(1-C)+x*S, C+z*z*(1-C)); |
|||
newDirection.z = tempZ* viewDirection; |
|||
|
|||
mViewCenter = mPos + newDirection; |
|||
} |
|||
|
|||
void Camera::SwitchTo3D() |
|||
{ |
|||
glMatrixMode(GL_PROJECTION); |
|||
glLoadIdentity(); |
|||
gluPerspective(50.0f, (float)mViewportWidth / (float)mViewportHeight, 0.1f, 1000.0f); |
|||
glMatrixMode(GL_MODELVIEW); |
|||
glLoadIdentity(); |
|||
} |
|||
|
|||
void Camera::SwitchTo2D() |
|||
{ |
|||
glMatrixMode(GL_PROJECTION); |
|||
glLoadIdentity(); |
|||
gluOrtho2D(-mViewportWidth / 2, mViewportWidth / 2, -mViewportHeight / 2, mViewportHeight / 2); |
|||
glMatrixMode(); |
|||
glLoadIdentity(); |
|||
} |
@ -0,0 +1,16 @@ |
|||
#pragma once |
|||
#include "vector3.h" |
|||
|
|||
class Camera { |
|||
public: |
|||
Camera(); |
|||
Vector3f mPos, mViewCenter, mUp; |
|||
bool mbMoveLeft, mbMoveRight, mbMoveForward, mbMoveBack; |
|||
int mViewportWidth, mViewportHeight; |
|||
void Update(float deltaTime); |
|||
void Picth(float angle); |
|||
void Yaw(float angle); |
|||
void RotateView(float angle, float x, float y, float z); |
|||
void SwitchTo3D(); |
|||
void SwitchTo2D(); |
|||
}; |
@ -0,0 +1,13 @@ |
|||
#pragma once |
|||
#include <windows.h> |
|||
#include <gl/GL.h> |
|||
#include <gl/GLU.h> |
|||
#include <gl/glext.h> |
|||
#include <stdio.h> |
|||
#include <math.h> |
|||
#include <string.h> |
|||
#include <string> |
|||
#include <sstream> |
|||
#include <vector> |
|||
#include <functional> |
|||
#include <iostream> |
@ -0,0 +1,58 @@ |
|||
#include "ground.h"
|
|||
|
|||
void Ground::Draw() |
|||
{ |
|||
glEnable(GL_LIGHTING); |
|||
glMaterialfv(GL_FRONT, GL_AMBIENT, mAmbientMaterial); |
|||
glMaterialfv(GL_FRONT, GL_DIFFUSE, mDiffuseMaterial); |
|||
glMaterialfv(GL_FRONT, GL_SPECULAR, mSpecularMaterial); |
|||
|
|||
//由于地面没有贴图,所以这里要开启颜色追踪
|
|||
glEnable(GL_COLOR_MATERIAL); |
|||
|
|||
glEnable(GL_DEPTH_TEST); |
|||
glDisable(GL_TEXTURE_2D); |
|||
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; |
|||
if ((z % 2) ^ (x % 2)) { |
|||
glColor4ub(41, 41, 41, 255); |
|||
} |
|||
else { |
|||
glColor4ub(200, 200, 200, 255); |
|||
} |
|||
|
|||
glVertex3f(xStart, -1.0f, zStart); |
|||
glVertex3f(xStart + 10.0f, -1.0f, zStart); |
|||
glVertex3f(xStart + 10.0f, -1.0f, zStart - 10.0f); |
|||
glVertex3f(xStart , -1.0f, zStart - 10.0f); |
|||
} |
|||
} |
|||
|
|||
glEnd(); |
|||
} |
|||
|
|||
void Ground::SetAmbientMaterial(float r, float g, float b, float a) { |
|||
mAmbientMaterial[0] = r; |
|||
mAmbientMaterial[1] = g; |
|||
mAmbientMaterial[2] = b; |
|||
mAmbientMaterial[3] = a; |
|||
} |
|||
|
|||
void Ground::SetDiffuseMaterial(float r, float g, float b, float a) { |
|||
mDiffuseMaterial[0] = r; |
|||
mDiffuseMaterial[1] = g; |
|||
mDiffuseMaterial[2] = b; |
|||
mDiffuseMaterial[3] = a; |
|||
} |
|||
|
|||
void Ground::SetSpecularMaterial(float r, float g, float b, float a) { |
|||
mSpecularMaterial[0] = r; |
|||
mSpecularMaterial[1] = g; |
|||
mSpecularMaterial[2] = b; |
|||
mSpecularMaterial[3] = a; |
|||
} |
@ -0,0 +1,13 @@ |
|||
#pragma once |
|||
#include "ggl.h" |
|||
|
|||
class Ground { |
|||
public: |
|||
float mAmbientMaterial[4], mDiffuseMaterial[4], mSpecularMaterial[4]; |
|||
void Draw(); |
|||
|
|||
//ÉèÖòÄÖÊ |
|||
void SetAmbientMaterial(float r, float g, float b, float a); |
|||
void SetDiffuseMaterial(float r, float g, float b, float a); |
|||
void SetSpecularMaterial(float r, float g, float b, float a); |
|||
}; |
@ -0,0 +1,96 @@ |
|||
#include "light.h"
|
|||
|
|||
Light::Light() |
|||
{ |
|||
} |
|||
|
|||
void Light::SetAmbientColor(float r, float g, float b, float a) |
|||
{ |
|||
float ambientColor[] = { r,g,b,a }; |
|||
glLightfv(mLightIdentifier, GL_AMBIENT, ambientColor); |
|||
} |
|||
|
|||
void Light::SetDiffuseColor(float r, float g, float b, float a) |
|||
{ |
|||
float diffuseColor[] = { r,g,b,a }; |
|||
glLightfv(mLightIdentifier, GL_DIFFUSE, diffuseColor); |
|||
} |
|||
|
|||
void Light::SetSpecularColor(float r, float g, float b, float a) |
|||
{ |
|||
float specularColor[] = { r,g,b,a }; |
|||
glLightfv(mLightIdentifier, GL_SPECULAR, specularColor); |
|||
} |
|||
|
|||
void Light::Enable() |
|||
{ |
|||
glEnable(GL_LIGHTING); |
|||
glEnable(mLightIdentifier); |
|||
} |
|||
|
|||
DirectionLight::DirectionLight(GLenum light) |
|||
{ |
|||
mLightIdentifier = light; |
|||
} |
|||
|
|||
void DirectionLight::SetPosition(float x, float y, float z) |
|||
{ |
|||
float pos[] = { x,y,z, 0.0f }; //这里齐次坐标写了0.0f代表这个光在最远处
|
|||
glLightfv(mLightIdentifier, GL_POSITION, pos); |
|||
} |
|||
|
|||
PointLight::PointLight(GLenum light) |
|||
{ |
|||
mLightIdentifier = light; |
|||
memset(mPosition, 0, sizeof(mPosition)); |
|||
} |
|||
|
|||
void PointLight::SetPosition(float x, float y, float z) |
|||
{ |
|||
//float pos[] = {x,y,z, 1.0f};//这里的齐次坐标为1.0代表在近处
|
|||
//glLightfv(mLightIdentifier, GL_POSITION, pos);
|
|||
mPosition[0] = x; |
|||
mPosition[1] = y; |
|||
mPosition[2] = z; |
|||
} |
|||
|
|||
void PointLight::SetConstAttenuation(float v) |
|||
{ |
|||
glLightf(mLightIdentifier, GL_CONSTANT_ATTENUATION, v); |
|||
} |
|||
|
|||
void PointLight::SetLinearAttenuation(float v) |
|||
{ |
|||
glLightf(mLightIdentifier, GL_LINEAR_ATTENUATION, v); |
|||
} |
|||
|
|||
void PointLight::SetQuadricAttenuation(float v) |
|||
{ |
|||
glLightf(mLightIdentifier, GL_QUADRATIC_ATTENUATION, v); |
|||
} |
|||
|
|||
void PointLight::Update(float x, float y, float z) |
|||
{ |
|||
float pos[] = {mPosition[0] - x, mPosition[1] - y, mPosition[2] - z, 1.0f}; |
|||
glLightfv(mLightIdentifier, GL_POSITION, pos); |
|||
} |
|||
|
|||
SpotLight::SpotLight(GLenum light):PointLight(light) |
|||
{ |
|||
} |
|||
|
|||
void SpotLight::SetDirection(float x, float y, float z) |
|||
{ |
|||
float dir[] = { x,y,z }; |
|||
glLightfv(mLightIdentifier, GL_SPOT_DIRECTION, dir);//设置聚光灯的朝向
|
|||
} |
|||
|
|||
void SpotLight::SetExpone(float v) |
|||
{ |
|||
glLightf(mLightIdentifier, GL_SPOT_EXPONENT, v);//设置聚光度,其实这里是一个角度,在这个角度内光是不衰减的
|
|||
} |
|||
|
|||
void SpotLight::SetCutoff(float v) |
|||
{ |
|||
glLightf(mLightIdentifier, GL_SPOT_CUTOFF, v);//设置聚光范围
|
|||
} |
@ -0,0 +1,38 @@ |
|||
#pragma once |
|||
#include "ggl.h" |
|||
|
|||
class Light { |
|||
protected: |
|||
GLenum mLightIdentifier; |
|||
Light(); |
|||
public: |
|||
void SetAmbientColor(float r, float g, float b, float a); |
|||
void SetDiffuseColor(float r, float g, float b, float a); |
|||
void SetSpecularColor(float r, float g, float b, float a); |
|||
void Enable(); |
|||
}; |
|||
|
|||
class DirectionLight : public Light { |
|||
public: |
|||
DirectionLight(GLenum light); |
|||
void SetPosition(float x, float y, float z); |
|||
}; |
|||
|
|||
class PointLight : public Light { |
|||
float mPosition[3]; |
|||
public: |
|||
PointLight(GLenum light); |
|||
void SetPosition(float x, float y, float z); |
|||
void SetConstAttenuation(float v); |
|||
void SetLinearAttenuation(float v); |
|||
void SetQuadricAttenuation(float v); |
|||
void Update(float x, float y, float z); |
|||
}; |
|||
|
|||
class SpotLight : public PointLight { |
|||
public: |
|||
SpotLight(GLenum light); |
|||
void SetDirection(float x, float y, float z); |
|||
void SetExpone(float v); |
|||
void SetCutoff(float v); |
|||
}; |
@ -0,0 +1,167 @@ |
|||
#include "ggl.h"
|
|||
#include "scene.h"
|
|||
#include "utils.h"
|
|||
#pragma comment(lib, "opengl32.lib")
|
|||
#pragma comment(lib, "glu32.lib")
|
|||
#pragma comment(lib, "winmm.lib")
|
|||
|
|||
POINT originalPos;//鼠标右键被按下时的位置
|
|||
bool rotateView = false; |
|||
|
|||
|
|||
unsigned char* LoadFileContent(const char* path, int &filesize) { |
|||
unsigned char* fileContent = nullptr; |
|||
filesize = 0; |
|||
|
|||
FILE *pFile = fopen(path, "rb"); |
|||
|
|||
if (pFile) { |
|||
fseek(pFile, 0, SEEK_END);//把文件指针移动至文件末尾
|
|||
int nLen = ftell(pFile);//文件位置指针当前位置相对于文件首的偏移字节数,这里其实就是得到了文件的字节长度
|
|||
if (nLen > 0) { |
|||
rewind(pFile);//把文件指针移到头部
|
|||
fileContent = new unsigned char[nLen + 1]; |
|||
fread(fileContent, sizeof(unsigned char), nLen, pFile); |
|||
fileContent[nLen] = '\0'; |
|||
filesize = nLen; |
|||
} |
|||
fclose(pFile); |
|||
} |
|||
return fileContent; |
|||
} |
|||
|
|||
/**
|
|||
* 获取每帧的消耗时间 |
|||
*/ |
|||
float GetFrameTime() { |
|||
static unsigned long lastTime = 0, timeSinceComputerStart = 0; |
|||
timeSinceComputerStart = timeGetTime(); |
|||
unsigned long frameTime = lastTime == 0 ? 0 : timeSinceComputerStart - lastTime; |
|||
lastTime = timeSinceComputerStart; |
|||
return float(frameTime) / 1000.0f; |
|||
} |
|||
|
|||
/**
|
|||
* @hwnd 发起消息的窗口 |
|||
* @msg 消息类型 |
|||
*/ |
|||
LRESULT CALLBACK GLWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { |
|||
switch (msg) { |
|||
case WM_RBUTTONDOWN: |
|||
GetCursorPos(&originalPos);//获取坐标位置
|
|||
ShowCursor(false);//隐藏鼠标
|
|||
rotateView = true; |
|||
return 0; |
|||
case WM_RBUTTONUP: |
|||
SetCursorPos(originalPos.x, originalPos.y); |
|||
ShowCursor(true); |
|||
rotateView = false; |
|||
return 0; |
|||
case WM_MOUSEMOVE: |
|||
if (rotateView) { |
|||
POINT currentPos; |
|||
GetCursorPos(¤tPos);//再一次获取鼠标当前位置
|
|||
int deltaX = currentPos.x - originalPos.x; |
|||
int deltaY = currentPos.y - originalPos.y; |
|||
OnMouseMove(deltaX, deltaY); |
|||
SetCursorPos(originalPos.x, originalPos.y); |
|||
} |
|||
return 0; |
|||
case WM_KEYDOWN: |
|||
OnKeyDown(wParam); |
|||
return 0; |
|||
case WM_KEYUP: |
|||
OnKeyUp(wParam); |
|||
return 0; |
|||
case WM_CLOSE: |
|||
PostQuitMessage(0); |
|||
return 0; |
|||
} |
|||
|
|||
return DefWindowProc(hwnd, msg, wParam, lParam);//其他消息调用window默认处理函数
|
|||
} |
|||
|
|||
/**
|
|||
* @hinstance 本应用程序启动实例 |
|||
* @hPrevInstance 上一次应用程式的实例 |
|||
* @IpCmdLine 命令行的参数 |
|||
* @ShowCmd 怎么显示窗口 |
|||
*/ |
|||
INT WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR IpCmdLine, int ShowCmd) { |
|||
|
|||
/*注册窗口*/ |
|||
WNDCLASSEX wndclass; |
|||
wndclass.cbClsExtra = 0; //窗口类型的额外空间,这里不需要
|
|||
wndclass.cbSize = sizeof(WNDCLASSEX); //窗口实际占用的内存
|
|||
wndclass.cbWndExtra = 0; //窗口的额外空间,这里不需要
|
|||
wndclass.hbrBackground = NULL; //窗口背景
|
|||
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //定义鼠标类型
|
|||
wndclass.hIcon = NULL; //应用程序exe文件显示图标
|
|||
wndclass.hIconSm = NULL; //应用程序运行时左上角图标
|
|||
wndclass.hInstance = hinstance; //本应用程序实例
|
|||
wndclass.lpfnWndProc = GLWindowProc; //如果用户操作了窗口,本函数会被调用
|
|||
wndclass.lpszClassName = L"GLWindow";//窗口名称
|
|||
wndclass.lpszMenuName = NULL;//菜单名称
|
|||
wndclass.style = CS_VREDRAW | CS_HREDRAW;//窗口更新时的重绘方式,这里使用垂直重绘和水平重绘
|
|||
ATOM atom = RegisterClassEx(&wndclass); |
|||
if (!atom) { |
|||
MessageBox(NULL, L"Register failed", L"Error", MB_OK); |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
/*创建窗口*/ |
|||
//调整窗口大小
|
|||
RECT rect; |
|||
rect.left = 0; |
|||
rect.right = 800; |
|||
rect.top = 0; |
|||
rect.bottom = 600; |
|||
AdjustWindowRect(&rect, WS_EX_OVERLAPPEDWINDOW, NULL); |
|||
int windowWidth = rect.right - rect.left; |
|||
int windowHeight = rect.bottom - rect.top; |
|||
|
|||
//窗口名称一定要和刚才注册窗口的保持一致
|
|||
HWND hwnd = CreateWindowEx(NULL, L"GLWindow", L"OpenGL Window", WS_OVERLAPPEDWINDOW, 100, 100, windowWidth, windowHeight, NULL, NULL, hinstance, NULL); |
|||
|
|||
//设置渲染环境
|
|||
HDC dc = GetDC(hwnd);//获取设备上下文
|
|||
PIXELFORMATDESCRIPTOR pfd; |
|||
memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); |
|||
pfd.nVersion = 1; |
|||
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); |
|||
pfd.cColorBits = 32; //颜色缓冲区每个像素为32比特4通道RGBA
|
|||
pfd.cDepthBits = 24; //深度缓冲区每个像素大小,24比特表示一个浮点数
|
|||
pfd.cStencilBits = 8; //蒙板缓冲区每像素为8比特
|
|||
pfd.iPixelType = PFD_TYPE_RGBA; //设置像素类型为RGBA
|
|||
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER ; //表示像素最后输出到窗口
|
|||
//设置像素格式
|
|||
int pixelFormat = ChoosePixelFormat(dc, &pfd); |
|||
SetPixelFormat(dc, pixelFormat, &pfd); |
|||
//创建OpenGL渲染环境
|
|||
HGLRC rc = wglCreateContext(dc); |
|||
wglMakeCurrent(dc, rc);//设置OpenGL渲染环境生效
|
|||
|
|||
Init(); |
|||
|
|||
/*显示窗口*/ |
|||
ShowWindow(hwnd, SW_SHOW); |
|||
UpdateWindow(hwnd); |
|||
|
|||
/*监听并处理用户请求*/ |
|||
MSG msg; |
|||
while (true) { |
|||
if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE)) { |
|||
if (msg.message == WM_QUIT) { |
|||
break; |
|||
} |
|||
TranslateMessage(&msg); |
|||
DispatchMessage(&msg); |
|||
} |
|||
|
|||
Draw(); |
|||
SwapBuffers(dc); |
|||
} |
|||
|
|||
return 0; |
|||
} |
@ -0,0 +1,193 @@ |
|||
#include "model.h"
|
|||
#include "utils.h"
|
|||
|
|||
Model::Model() |
|||
{ |
|||
//初始化材质
|
|||
memset(mAmbientMaterial, 0, sizeof(mAmbientMaterial)); |
|||
memset(mDiffuseMaterial, 0, sizeof(mDiffuseMaterial)); |
|||
memset(mSpecularMaterial, 0, sizeof(mSpecularMaterial)); |
|||
} |
|||
|
|||
void Model::Init(const char * modelPath) |
|||
{ |
|||
struct FloatData { |
|||
float v[3]; |
|||
}; |
|||
|
|||
struct VertexDefine { |
|||
int posIndex; |
|||
int texcoordIndex; |
|||
int normalIndex; |
|||
}; |
|||
|
|||
int nFileSize = 0; |
|||
unsigned char* fileContent = LoadFileContent(modelPath, nFileSize); |
|||
|
|||
if (fileContent == nullptr) { |
|||
return; |
|||
} |
|||
|
|||
std::vector<FloatData> positions, texcoords, normals; |
|||
std::vector<VertexDefine> vertexes; |
|||
std::vector<int> indexes; |
|||
std::string temp; |
|||
|
|||
//存储文件内容,内存块
|
|||
std::stringstream ssFileContent((char*)fileContent); |
|||
|
|||
//存储行数据
|
|||
char szOneLine[256]; |
|||
|
|||
//使用流来读取文件
|
|||
while (!ssFileContent.eof()) { |
|||
//读取一行
|
|||
memset(szOneLine, 0, 256); |
|||
ssFileContent.getline(szOneLine, 256); |
|||
//空行不处理
|
|||
if (strlen(szOneLine) > 0) { |
|||
if (szOneLine[0] == 'v') { |
|||
std::stringstream ssOneLine(szOneLine); |
|||
if (szOneLine[1] == 't') { |
|||
ssOneLine >> temp;//通过流输出vt到 temp
|
|||
FloatData floatData; |
|||
ssOneLine >> floatData.v[0]; |
|||
ssOneLine >> floatData.v[1]; |
|||
texcoords.push_back(floatData); |
|||
printf("texcoord : %f,%f\n", floatData.v[0], floatData.v[1]); |
|||
} |
|||
else if (szOneLine[1] == 'n') { |
|||
ssOneLine >> temp; |
|||
FloatData floatData; |
|||
ssOneLine >> floatData.v[0]; |
|||
ssOneLine >> floatData.v[1]; |
|||
ssOneLine >> floatData.v[2]; |
|||
normals.push_back(floatData); |
|||
printf("normal : %f,%f,%f\n", floatData.v[0], floatData.v[1], floatData.v[2]); |
|||
} |
|||
else { |
|||
ssOneLine >> temp; |
|||
FloatData floatData; |
|||
ssOneLine >> floatData.v[0]; |
|||
ssOneLine >> floatData.v[1]; |
|||
ssOneLine >> floatData.v[2]; |
|||
positions.push_back(floatData); |
|||
printf("position : %f,%f,%f\n", floatData.v[0], floatData.v[1], floatData.v[2]); |
|||
} |
|||
} |
|||
else if (szOneLine[0] == 'f') { |
|||
std::stringstream ssOneLine(szOneLine); |
|||
ssOneLine >> temp; |
|||
std::string vertexStr; |
|||
|
|||
for (int i = 0; i < 3; i++) { |
|||
ssOneLine >> vertexStr; |
|||
|
|||
//获取position索引
|
|||
size_t pos = vertexStr.find_first_of('/'); |
|||
std::string posIndexStr = vertexStr.substr(0, pos); |
|||
|
|||
//获取texcoord索引
|
|||
size_t pos2 = vertexStr.find_first_of('/', pos + 1); |
|||
std::string texcoordIndexStr = vertexStr.substr(pos + 1, pos2 - 1 - pos); |
|||
|
|||
//获取normal索引
|
|||
std::string normalIndexStr = vertexStr.substr(pos2 + 1, vertexStr.length() - 1 - pos2); |
|||
|
|||
VertexDefine vd; |
|||
vd.posIndex = atoi(posIndexStr.c_str()); |
|||
vd.texcoordIndex = atoi(texcoordIndexStr.c_str()); |
|||
vd.normalIndex = atoi(normalIndexStr.c_str()); |
|||
|
|||
//去除重复
|
|||
int nCurrentVertexIndex = -1; |
|||
int nCurrentVertexCount = (int)vertexes.size(); |
|||
|
|||
for (int j = 0; j < nCurrentVertexCount; j++) { |
|||
if (vertexes[j].posIndex == vd.posIndex && vertexes[j].texcoordIndex == vd.texcoordIndex && vertexes[j].normalIndex == vd.normalIndex) { |
|||
nCurrentVertexIndex = j; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
if (nCurrentVertexIndex == -1) { |
|||
nCurrentVertexIndex = (int)vertexes.size(); |
|||
vertexes.push_back(vd); |
|||
} |
|||
indexes.push_back(nCurrentVertexIndex); |
|||
} |
|||
|
|||
printf("draw command : %s\n", szOneLine); |
|||
} |
|||
} |
|||
} |
|||
|
|||
//TODO为啥要复制???
|
|||
mIndexCount = (int)indexes.size(); |
|||
mIndexes = new unsigned short[mIndexCount]; |
|||
for (int i = 0; i < mIndexCount; ++i) { |
|||
mIndexes[i] = indexes[i]; |
|||
} |
|||
|
|||
int vertexCount = (int)vertexes.size(); |
|||
mVertexes = new VertexData[vertexCount]; |
|||
for (int i = 0; i < vertexCount; i++) { |
|||
memcpy(mVertexes[i].position, positions[vertexes[i].posIndex - 1].v, sizeof(float) * 3); |
|||
memcpy(mVertexes[i].texcoord, texcoords[vertexes[i].texcoordIndex - 1].v, sizeof(float) * 2); |
|||
memcpy(mVertexes[i].normal, normals[vertexes[i].normalIndex - 1].v, sizeof(float) * 3); |
|||
} |
|||
|
|||
delete fileContent; |
|||
} |
|||
|
|||
void Model::Draw() |
|||
{ |
|||
//开启光照
|
|||
glEnable(GL_LIGHTING); |
|||
glMaterialfv(GL_FRONT, GL_AMBIENT, mAmbientMaterial); |
|||
glMaterialfv(GL_FRONT, GL_DIFFUSE, mDiffuseMaterial); |
|||
glMaterialfv(GL_FRONT, GL_SPECULAR, mSpecularMaterial); |
|||
|
|||
//开启纹理
|
|||
glEnable(GL_TEXTURE_2D); |
|||
//glMaterialf(GL_FRONT, GL_SHININESS, 64.0f);
|
|||
//glDisable(GL_TEXTURE_2D);
|
|||
glBindTexture(GL_TEXTURE_2D, mTexture); |
|||
glEnable(GL_DEPTH_TEST); |
|||
|
|||
glPushMatrix(); |
|||
glTranslatef(0.0f, 0.0f, -5.0f); |
|||
static float t = 0.0; |
|||
glRotated(t, 1.0f, 1.0f, 1.0f); |
|||
t += 0.05; |
|||
glBegin(GL_TRIANGLES); |
|||
for (int i = 0; i < mIndexCount; i++) { |
|||
glTexCoord2fv(mVertexes[mIndexes[i]].texcoord); |
|||
glNormal3fv(mVertexes[mIndexes[i]].normal); |
|||
glVertex3fv(mVertexes[mIndexes[i]].position); |
|||
} |
|||
glEnd(); |
|||
glPopMatrix(); |
|||
} |
|||
|
|||
|
|||
void Model::SetAmbientMaterial(float r, float g, float b, float a) { |
|||
mAmbientMaterial[0] = r; |
|||
mAmbientMaterial[1] = g; |
|||
mAmbientMaterial[2] = b; |
|||
mAmbientMaterial[3] = a; |
|||
} |
|||
|
|||
void Model::SetDiffuseMaterial(float r, float g, float b, float a) { |
|||
mDiffuseMaterial[0] = r; |
|||
mDiffuseMaterial[1] = g; |
|||
mDiffuseMaterial[2] = b; |
|||
mDiffuseMaterial[3] = a; |
|||
} |
|||
|
|||
void Model::SetSpecularMaterial(float r, float g, float b, float a) { |
|||
mSpecularMaterial[0] = r; |
|||
mSpecularMaterial[1] = g; |
|||
mSpecularMaterial[2] = b; |
|||
mSpecularMaterial[3] = a; |
|||
} |
@ -0,0 +1,27 @@ |
|||
#pragma once |
|||
#include "ggl.h" |
|||
|
|||
struct VertexData { |
|||
float position[3]; |
|||
float normal[3]; |
|||
float texcoord[2]; |
|||
}; |
|||
|
|||
class Model { |
|||
|
|||
public: |
|||
VertexData* mVertexes; |
|||
unsigned short *mIndexes; |
|||
int mIndexCount; |
|||
GLuint mTexture; |
|||
float mAmbientMaterial[4], mDiffuseMaterial[4], mSpecularMaterial[4]; |
|||
|
|||
Model(); |
|||
void Init(const char* modelPatch); |
|||
void Draw(); |
|||
|
|||
//ÉèÖòÄÖÊ |
|||
void SetAmbientMaterial(float r, float g, float b, float a); |
|||
void SetDiffuseMaterial(float r, float g, float b, float a); |
|||
void SetSpecularMaterial(float r, float g, float b, float a); |
|||
}; |
@ -0,0 +1,28 @@ |
|||
|
|||
Microsoft Visual Studio Solution File, Format Version 12.00 |
|||
# Visual Studio 14 |
|||
VisualStudioVersion = 14.0.25420.1 |
|||
MinimumVisualStudioVersion = 10.0.40219.1 |
|||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opengl", "opengl.vcxproj", "{43BEF74F-1C6B-4178-AC60-32864B889DE7}" |
|||
EndProject |
|||
Global |
|||
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
|||
Debug|x64 = Debug|x64 |
|||
Debug|x86 = Debug|x86 |
|||
Release|x64 = Release|x64 |
|||
Release|x86 = Release|x86 |
|||
EndGlobalSection |
|||
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
|||
{43BEF74F-1C6B-4178-AC60-32864B889DE7}.Debug|x64.ActiveCfg = Debug|x64 |
|||
{43BEF74F-1C6B-4178-AC60-32864B889DE7}.Debug|x64.Build.0 = Debug|x64 |
|||
{43BEF74F-1C6B-4178-AC60-32864B889DE7}.Debug|x86.ActiveCfg = Debug|Win32 |
|||
{43BEF74F-1C6B-4178-AC60-32864B889DE7}.Debug|x86.Build.0 = Debug|Win32 |
|||
{43BEF74F-1C6B-4178-AC60-32864B889DE7}.Release|x64.ActiveCfg = Release|x64 |
|||
{43BEF74F-1C6B-4178-AC60-32864B889DE7}.Release|x64.Build.0 = Release|x64 |
|||
{43BEF74F-1C6B-4178-AC60-32864B889DE7}.Release|x86.ActiveCfg = Release|Win32 |
|||
{43BEF74F-1C6B-4178-AC60-32864B889DE7}.Release|x86.Build.0 = Release|Win32 |
|||
EndGlobalSection |
|||
GlobalSection(SolutionProperties) = preSolution |
|||
HideSolutionNode = FALSE |
|||
EndGlobalSection |
|||
EndGlobal |
@ -0,0 +1,173 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
|||
<ItemGroup Label="ProjectConfigurations"> |
|||
<ProjectConfiguration Include="Debug|Win32"> |
|||
<Configuration>Debug</Configuration> |
|||
<Platform>Win32</Platform> |
|||
</ProjectConfiguration> |
|||
<ProjectConfiguration Include="Release|Win32"> |
|||
<Configuration>Release</Configuration> |
|||
<Platform>Win32</Platform> |
|||
</ProjectConfiguration> |
|||
<ProjectConfiguration Include="Debug|x64"> |
|||
<Configuration>Debug</Configuration> |
|||
<Platform>x64</Platform> |
|||
</ProjectConfiguration> |
|||
<ProjectConfiguration Include="Release|x64"> |
|||
<Configuration>Release</Configuration> |
|||
<Platform>x64</Platform> |
|||
</ProjectConfiguration> |
|||
</ItemGroup> |
|||
<PropertyGroup Label="Globals"> |
|||
<ProjectGuid>{43BEF74F-1C6B-4178-AC60-32864B889DE7}</ProjectGuid> |
|||
<Keyword>Win32Proj</Keyword> |
|||
<RootNamespace>opengl</RootNamespace> |
|||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> |
|||
</PropertyGroup> |
|||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> |
|||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> |
|||
<ConfigurationType>Application</ConfigurationType> |
|||
<UseDebugLibraries>true</UseDebugLibraries> |
|||
<PlatformToolset>v140</PlatformToolset> |
|||
<CharacterSet>Unicode</CharacterSet> |
|||
</PropertyGroup> |
|||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> |
|||
<ConfigurationType>Application</ConfigurationType> |
|||
<UseDebugLibraries>false</UseDebugLibraries> |
|||
<PlatformToolset>v140</PlatformToolset> |
|||
<WholeProgramOptimization>true</WholeProgramOptimization> |
|||
<CharacterSet>Unicode</CharacterSet> |
|||
</PropertyGroup> |
|||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> |
|||
<ConfigurationType>Application</ConfigurationType> |
|||
<UseDebugLibraries>true</UseDebugLibraries> |
|||
<PlatformToolset>v140</PlatformToolset> |
|||
<CharacterSet>Unicode</CharacterSet> |
|||
</PropertyGroup> |
|||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> |
|||
<ConfigurationType>Application</ConfigurationType> |
|||
<UseDebugLibraries>false</UseDebugLibraries> |
|||
<PlatformToolset>v140</PlatformToolset> |
|||
<WholeProgramOptimization>true</WholeProgramOptimization> |
|||
<CharacterSet>Unicode</CharacterSet> |
|||
</PropertyGroup> |
|||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> |
|||
<ImportGroup Label="ExtensionSettings"> |
|||
</ImportGroup> |
|||
<ImportGroup Label="Shared"> |
|||
</ImportGroup> |
|||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
|||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |
|||
</ImportGroup> |
|||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
|||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |
|||
</ImportGroup> |
|||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |
|||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |
|||
</ImportGroup> |
|||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |
|||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |
|||
</ImportGroup> |
|||
<PropertyGroup Label="UserMacros" /> |
|||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
|||
<LinkIncremental>true</LinkIncremental> |
|||
</PropertyGroup> |
|||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |
|||
<LinkIncremental>true</LinkIncremental> |
|||
</PropertyGroup> |
|||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
|||
<LinkIncremental>false</LinkIncremental> |
|||
</PropertyGroup> |
|||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |
|||
<LinkIncremental>false</LinkIncremental> |
|||
</PropertyGroup> |
|||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
|||
<ClCompile> |
|||
<PrecompiledHeader> |
|||
</PrecompiledHeader> |
|||
<WarningLevel>Level3</WarningLevel> |
|||
<Optimization>Disabled</Optimization> |
|||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
|||
</ClCompile> |
|||
<Link> |
|||
<SubSystem>Windows</SubSystem> |
|||
<GenerateDebugInformation>true</GenerateDebugInformation> |
|||
</Link> |
|||
</ItemDefinitionGroup> |
|||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |
|||
<ClCompile> |
|||
<PrecompiledHeader> |
|||
</PrecompiledHeader> |
|||
<WarningLevel>Level3</WarningLevel> |
|||
<Optimization>Disabled</Optimization> |
|||
<PreprocessorDefinitions>_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
|||
</ClCompile> |
|||
<Link> |
|||
<SubSystem>Windows</SubSystem> |
|||
<GenerateDebugInformation>true</GenerateDebugInformation> |
|||
</Link> |
|||
</ItemDefinitionGroup> |
|||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
|||
<ClCompile> |
|||
<WarningLevel>Level3</WarningLevel> |
|||
<PrecompiledHeader> |
|||
</PrecompiledHeader> |
|||
<Optimization>MaxSpeed</Optimization> |
|||
<FunctionLevelLinking>true</FunctionLevelLinking> |
|||
<IntrinsicFunctions>true</IntrinsicFunctions> |
|||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
|||
</ClCompile> |
|||
<Link> |
|||
<SubSystem>Windows</SubSystem> |
|||
<EnableCOMDATFolding>true</EnableCOMDATFolding> |
|||
<OptimizeReferences>true</OptimizeReferences> |
|||
<GenerateDebugInformation>true</GenerateDebugInformation> |
|||
</Link> |
|||
</ItemDefinitionGroup> |
|||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |
|||
<ClCompile> |
|||
<WarningLevel>Level3</WarningLevel> |
|||
<PrecompiledHeader> |
|||
</PrecompiledHeader> |
|||
<Optimization>MaxSpeed</Optimization> |
|||
<FunctionLevelLinking>true</FunctionLevelLinking> |
|||
<IntrinsicFunctions>true</IntrinsicFunctions> |
|||
<PreprocessorDefinitions>NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
|||
</ClCompile> |
|||
<Link> |
|||
<SubSystem>Windows</SubSystem> |
|||
<EnableCOMDATFolding>true</EnableCOMDATFolding> |
|||
<OptimizeReferences>true</OptimizeReferences> |
|||
<GenerateDebugInformation>true</GenerateDebugInformation> |
|||
</Link> |
|||
</ItemDefinitionGroup> |
|||
<ItemGroup> |
|||
<ClCompile Include="camera.cpp" /> |
|||
<ClCompile Include="ground.cpp" /> |
|||
<ClCompile Include="light.cpp" /> |
|||
<ClCompile Include="main.cpp" /> |
|||
<ClCompile Include="model.cpp" /> |
|||
<ClCompile Include="scene.cpp" /> |
|||
<ClCompile Include="skybox.cpp" /> |
|||
<ClCompile Include="utils.cpp" /> |
|||
<ClCompile Include="vector3.cpp" /> |
|||
</ItemGroup> |
|||
<ItemGroup> |
|||
<ClInclude Include="camera.h" /> |
|||
<ClInclude Include="ggl.h" /> |
|||
<ClInclude Include="ground.h" /> |
|||
<ClInclude Include="light.h" /> |
|||
<ClInclude Include="model.h" /> |
|||
<ClInclude Include="resource.h" /> |
|||
<ClInclude Include="scene.h" /> |
|||
<ClInclude Include="skybox.h" /> |
|||
<ClInclude Include="utils.h" /> |
|||
<ClInclude Include="vector3.h" /> |
|||
</ItemGroup> |
|||
<ItemGroup> |
|||
<ResourceCompile Include="opengl.rc" /> |
|||
</ItemGroup> |
|||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> |
|||
<ImportGroup Label="ExtensionTargets"> |
|||
</ImportGroup> |
|||
</Project> |
@ -0,0 +1,83 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
|||
<ItemGroup> |
|||
<Filter Include="源文件"> |
|||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> |
|||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> |
|||
</Filter> |
|||
<Filter Include="头文件"> |
|||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> |
|||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions> |
|||
</Filter> |
|||
<Filter Include="资源文件"> |
|||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> |
|||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> |
|||
</Filter> |
|||
</ItemGroup> |
|||
<ItemGroup> |
|||
<ClCompile Include="main.cpp"> |
|||
<Filter>源文件</Filter> |
|||
</ClCompile> |
|||
<ClCompile Include="scene.cpp"> |
|||
<Filter>源文件</Filter> |
|||
</ClCompile> |
|||
<ClCompile Include="utils.cpp"> |
|||
<Filter>源文件</Filter> |
|||
</ClCompile> |
|||
<ClCompile Include="skybox.cpp"> |
|||
<Filter>源文件</Filter> |
|||
</ClCompile> |
|||
<ClCompile Include="model.cpp"> |
|||
<Filter>源文件</Filter> |
|||
</ClCompile> |
|||
<ClCompile Include="ground.cpp"> |
|||
<Filter>源文件</Filter> |
|||
</ClCompile> |
|||
<ClCompile Include="light.cpp"> |
|||
<Filter>源文件</Filter> |
|||
</ClCompile> |
|||
<ClCompile Include="vector3.cpp"> |
|||
<Filter>源文件</Filter> |
|||
</ClCompile> |
|||
<ClCompile Include="camera.cpp"> |
|||
<Filter>源文件</Filter> |
|||
</ClCompile> |
|||
</ItemGroup> |
|||
<ItemGroup> |
|||
<ClInclude Include="ggl.h"> |
|||
<Filter>源文件</Filter> |
|||
</ClInclude> |
|||
<ClInclude Include="scene.h"> |
|||
<Filter>源文件</Filter> |
|||
</ClInclude> |
|||
<ClInclude Include="utils.h"> |
|||
<Filter>源文件</Filter> |
|||
</ClInclude> |
|||
<ClInclude Include="skybox.h"> |
|||
<Filter>源文件</Filter> |
|||
</ClInclude> |
|||
<ClInclude Include="model.h"> |
|||
<Filter>源文件</Filter> |
|||
</ClInclude> |
|||
<ClInclude Include="resource.h"> |
|||
<Filter>头文件</Filter> |
|||
</ClInclude> |
|||
<ClInclude Include="ground.h"> |
|||
<Filter>源文件</Filter> |
|||
</ClInclude> |
|||
<ClInclude Include="light.h"> |
|||
<Filter>源文件</Filter> |
|||
</ClInclude> |
|||
<ClInclude Include="vector3.h"> |
|||
<Filter>源文件</Filter> |
|||
</ClInclude> |
|||
<ClInclude Include="camera.h"> |
|||
<Filter>源文件</Filter> |
|||
</ClInclude> |
|||
</ItemGroup> |
|||
<ItemGroup> |
|||
<ResourceCompile Include="opengl.rc"> |
|||
<Filter>资源文件</Filter> |
|||
</ResourceCompile> |
|||
</ItemGroup> |
|||
</Project> |
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
|||
<PropertyGroup> |
|||
<ShowAllFiles>false</ShowAllFiles> |
|||
</PropertyGroup> |
|||
</Project> |
@ -0,0 +1,14 @@ |
|||
//{{NO_DEPENDENCIES}} |
|||
// Microsoft Visual C++ generated include file. |
|||
// Used by opengl.rc |
|||
|
|||
// 新对象的下一组默认值 |
|||
// |
|||
#ifdef APSTUDIO_INVOKED |
|||
#ifndef APSTUDIO_READONLY_SYMBOLS |
|||
#define _APS_NEXT_RESOURCE_VALUE 101 |
|||
#define _APS_NEXT_COMMAND_VALUE 40001 |
|||
#define _APS_NEXT_CONTROL_VALUE 1001 |
|||
#define _APS_NEXT_SYMED_VALUE 101 |
|||
#endif |
|||
#endif |
@ -0,0 +1,506 @@ |
|||
#include "scene.h"
|
|||
#include "utils.h"
|
|||
#include "skybox.h"
|
|||
#include "model.h"
|
|||
#include "ground.h"
|
|||
#include "light.h"
|
|||
#include "camera.h"
|
|||
|
|||
GLuint texture; |
|||
SkyBox skybox; |
|||
Model model; |
|||
Ground ground; |
|||
DirectionLight light(GL_LIGHT0); |
|||
PointLight light1(GL_LIGHT1); |
|||
PointLight light2(GL_LIGHT2); |
|||
SpotLight light3(GL_LIGHT3); |
|||
Camera camera; |
|||
|
|||
void Init() { |
|||
glMatrixMode(GL_PROJECTION); |
|||
gluPerspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f); |
|||
|
|||
glMatrixMode(GL_MODELVIEW); |
|||
glLoadIdentity(); |
|||
|
|||
texture = CreateTexture2DFromBMP("Res/earth.bmp"); |
|||
|
|||
skybox.Init("Res/"); |
|||
model.Init("Res/Sphere.obj"); |
|||
model.mTexture = CreateTexture2DFromBMP("Res/earth.bmp"); |
|||
|
|||
light.SetAmbientColor(0.1f, 0.1f, 0.1f, 1.0f); |
|||
light.SetDiffuseColor(0.8f, 0.8f, 0.8f, 1.0f); |
|||
light.SetSpecularColor(1.0f, 1.0f, 1.0f, 1.0f); |
|||
light.SetPosition(0.0f, 1.0f, 0.0f); |
|||
|
|||
light1.SetAmbientColor(0.1f,0.1f,0.1f,1.0f); |
|||
light1.SetDiffuseColor(0.8f,0.8f,0.8f,1.0f); |
|||
light1.SetSpecularColor(1.0f,1.0f,1.0f,1.0f); |
|||
light1.SetPosition(0.0f,0.0f,0.0f);//把点光源放到摄像机位置
|
|||
light1.SetConstAttenuation(1.0f); |
|||
light1.SetLinearAttenuation(0.2f); |
|||
|
|||
light2.SetAmbientColor(0.1f, 0.1f, 0.1f, 1.0f); |
|||
light2.SetDiffuseColor(0.1f, 0.4f, 0.6f, 1.0f); |
|||
light2.SetSpecularColor(1.0f, 1.0f, 1.0f, 1.0f); |
|||
light2.SetPosition(0.0f, 0.0f, -30.0f);//把点光源放到摄像机位置
|
|||
light2.SetConstAttenuation(1.0f); |
|||
light2.SetLinearAttenuation(0.2f); |
|||
|
|||
light3.SetAmbientColor(0.1f, 0.1f, 0.1f, 1.0f); |
|||
light3.SetDiffuseColor(0.0f, 0.8f, 0.0f, 1.0f); |
|||
light3.SetSpecularColor(1.0f,0.0f,0.0f,1.0f); |
|||
light3.SetPosition(10.0f,50.0f,-30.0f); |
|||
light3.SetDirection(0.0,-1.0f,0.0f);//设置朝向
|
|||
light3.SetExpone(5.0f);//设置聚光度 5度
|
|||
light3.SetCutoff(10.0f);//设置照射范围 10度
|
|||
|
|||
|
|||
model.SetAmbientMaterial(0.1f, 0.1f, 0.1f, 1.0f); |
|||
model.SetDiffuseMaterial(0.4f, 0.4f, 0.4f, 1.0f); |
|||
model.SetSpecularMaterial(1.0f, 1.0f, 1.0f, 1.0f); |
|||
|
|||
ground.SetAmbientMaterial(0.1f, 0.1f, 0.1f, 1.0f); |
|||
ground.SetDiffuseMaterial(0.4f, 0.4f, 0.4f, 1.0f); |
|||
ground.SetSpecularMaterial(0.0f, 0.0f, 0.0f, 1.0f); |
|||
|
|||
camera.mViewportWidth = 800.0f; |
|||
camera.mViewportHeight = 600.0f; |
|||
} |
|||
|
|||
void DrawMutipl() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT); |
|||
glLoadIdentity(); |
|||
|
|||
glPushMatrix(); |
|||
glTranslatef(0.0f, 0.0f, -5.0f); |
|||
|
|||
static float r = 0; |
|||
glPushMatrix(); |
|||
glRotatef(r, 0.0f, 1.0f, 0.0f); |
|||
|
|||
r += 0.1f; |
|||
|
|||
glBegin(GL_TRIANGLES); |
|||
glColor4ub(255, 0, 0, 255); glVertex3f(-0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 0, 255, 255); glVertex3f(0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(0.0f, 0.25f, -2.5f); |
|||
glEnd(); |
|||
|
|||
glPopMatrix(); |
|||
glPopMatrix(); |
|||
|
|||
} |
|||
|
|||
void DrawPushMatrix() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT); |
|||
glLoadIdentity();//重置模型视口矩阵为单位矩阵
|
|||
|
|||
glPushMatrix(); |
|||
glTranslatef(-1.0f, 0.0f, 0.0f); |
|||
glBegin(GL_TRIANGLES); |
|||
glColor4ub(255, 0, 0, 255); glVertex3f(-0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 0, 255, 255); glVertex3f(0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(0.0f, 0.25f, -2.5f); |
|||
glEnd(); |
|||
glPopMatrix(); |
|||
|
|||
glPushMatrix(); |
|||
glTranslatef(1.0f, 0.0f, 0.0f); |
|||
glBegin(GL_TRIANGLES); |
|||
glColor4ub(255, 0, 0, 255); glVertex3f(-0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 0, 255, 255); glVertex3f(0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(0.0f, 0.25f, -2.5f); |
|||
glEnd(); |
|||
glPopMatrix(); |
|||
|
|||
} |
|||
|
|||
void DrawRoated() { |
|||
glClearColor(30.0f / 255.0f, 30.0f / 255.0f, 30.0f / 255.0f, 1.0f); |
|||
glClear(GL_COLOR_BUFFER_BIT); |
|||
|
|||
|
|||
static float r = 0.0f; |
|||
|
|||
glLoadIdentity(); |
|||
glRotated(r, 0, 0, 1);// (角度,x,y,z)
|
|||
|
|||
r += 0.1f; |
|||
|
|||
glBegin(GL_TRIANGLES); |
|||
glColor4ub(255, 0, 0, 255); glVertex3f(-0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 0, 255, 255); glVertex3f(0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(0.0f, 0.25f, -2.5f); |
|||
glEnd(); |
|||
} |
|||
|
|||
void DrawTranslate() { |
|||
glClearColor(30.0f / 255.0f, 30.0f / 255.0f, 30.0f / 255.0f, 1.0f); |
|||
glClear(GL_COLOR_BUFFER_BIT); |
|||
|
|||
glLoadIdentity(); |
|||
glTranslatef(0, 0, -2.5f); |
|||
|
|||
glBegin(GL_TRIANGLES); |
|||
glColor4ub(255, 0, 0, 255); glVertex3f(-0.5f, -0.25f, 0.0f); |
|||
glColor4ub(0, 0, 255, 255); glVertex3f(0.5f, -0.25f, 0.0f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(0.0f, 0.25f, 0.0f); |
|||
glEnd(); |
|||
} |
|||
|
|||
|
|||
void DrawPolygon() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT); |
|||
|
|||
glBegin(GL_POLYGON); |
|||
|
|||
glColor4ub(255, 0, 0, 255); glVertex3f(-0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 0, 255, 255); glVertex3f(0.5f, -0.25, -2.5f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(1.0f, 0.25f, -2.5f); |
|||
glColor4ub(255, 0, 0, 255); glVertex3f(0.5f, 0.25f, -2.5f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(-0.1f, 0.1f, -2.5f); |
|||
|
|||
glEnd(); |
|||
|
|||
} |
|||
|
|||
|
|||
void DrawQuadStrip() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT); |
|||
|
|||
glBegin(GL_QUAD_STRIP); |
|||
glColor4ub(255, 0, 0, 255); glVertex3f(-0.25f, -0.25f, -2.5f); |
|||
glColor4ub(0, 0, 255, 255); glVertex3f(0.25f, -0.25f, -2.5f); |
|||
glColor4ub(255, 0, 0, 255); glVertex3f(-0.25f, 0.25f, -2.5f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(0.25, 0.25, -2.5f); |
|||
|
|||
glColor4ub(255, 0, 0, 255); glVertex3f(-0.25f, 0.5f, -2.5f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(0.25, 0.5, -2.5f); |
|||
glEnd(); |
|||
} |
|||
|
|||
void DrawQuads() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT); |
|||
|
|||
glBegin(GL_QUADS); |
|||
|
|||
glColor4ub(255, 0, 0, 255); glVertex3f(-0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 0, 255, 255); glVertex3f(0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(1.0f, 0.5f, -2.5f); |
|||
glColor4ub(255, 0, 0, 255); glVertex3f(0.5f, 0.5f, -2.5f); |
|||
|
|||
glEnd(); |
|||
} |
|||
|
|||
void DrawLineStrip() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT); |
|||
|
|||
glLineWidth(10.0f); |
|||
glBegin(GL_LINE_STRIP); |
|||
|
|||
glColor4ub(255, 0, 0, 255); glVertex3f(-0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 0, 255, 255); glVertex3f(0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(0.5f, 0.25f, -2.5f); |
|||
|
|||
glEnd(); |
|||
} |
|||
|
|||
void DrawLineLoop() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT); |
|||
|
|||
glLineWidth(10.0f); |
|||
glBegin(GL_LINE_LOOP); |
|||
|
|||
glColor4ub(255, 0, 0, 255); glVertex3f(-0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 0, 255, 255); glVertex3f(0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(0.5f, 0.25f, -2.5f); |
|||
|
|||
glEnd(); |
|||
} |
|||
|
|||
void DrawLines() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT); |
|||
|
|||
glLineWidth(10.0f); |
|||
glBegin(GL_LINES); |
|||
|
|||
glColor4ub(255, 0, 0, 255); glVertex3f(-0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 0, 255, 255); glVertex3f(0.5f, -0.25f, -2.5f); |
|||
|
|||
glColor4ub(0, 0, 255, 255); glVertex3f(0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(0.5f, 0.25f, -2.5f); |
|||
|
|||
glEnd(); |
|||
} |
|||
|
|||
void DrawPoints() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT); |
|||
|
|||
glPointSize(10.0f); |
|||
glBegin(GL_POINTS); |
|||
glColor4ub(255, 0, 0, 255); glVertex3f(-0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(0.5f, -0.25f, -2.5f); |
|||
glEnd(); |
|||
} |
|||
|
|||
void DrawTriangleFan() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT); |
|||
|
|||
glBegin(GL_TRIANGLE_FAN); |
|||
glColor4ub(255, 0, 0, 255); glVertex3f(0.0f, -0.25f, -2.5f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 0, 255, 255); glVertex3f(0.4f, 0.0f, -2.5f); |
|||
glColor4ub(0, 0, 255, 255); glVertex3f(0.2f, 0.15f, -2.5f); |
|||
glColor4ub(0, 0, 255, 255); glVertex3f(0.0f, 0.2f, -2.5f); |
|||
glEnd(); |
|||
} |
|||
|
|||
void DrawTriangleStrip() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT); |
|||
|
|||
glBegin(GL_TRIANGLE_STRIP); |
|||
|
|||
glColor4ub(255, 0, 0, 255); glVertex3f(-0.5f, -0.25f, -2.5f); |
|||
glColor4ub(0, 0, 255, 255); glVertex3f(0.5f, -0.25, -2.5f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(-0.5f, 0.25f, -2.5f); |
|||
glColor4ub(0, 255, 0, 255); glVertex3f(0.5f, 0.25f, -2.5f); |
|||
|
|||
glEnd(); |
|||
} |
|||
|
|||
void DrawTriangles() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT); |
|||
|
|||
glBegin(GL_TRIANGLES); |
|||
|
|||
glColor4ub(255, 255, 255, 255); |
|||
glVertex3f(-0.2f, -0.2f, -1.5f); |
|||
|
|||
glColor4ub(255, 0, 0, 255); |
|||
glVertex3f(0.2f, -0.2f, -1.5f); |
|||
|
|||
glColor4ub(0, 255, 0, 255); |
|||
glVertex3f(0.0f, 0.2f, -1.5f); |
|||
|
|||
glEnd(); |
|||
} |
|||
|
|||
void DrawEnableLight() { |
|||
glClearColor(30.0f / 255.0f, 30.0f / 255.0f, 30.0f / 255.0f, 1.0f); |
|||
glClear(GL_COLOR_BUFFER_BIT); |
|||
glEnable(GL_LIGHTING); |
|||
|
|||
glEnable(GL_LIGHT0); |
|||
glEnable(GL_CULL_FACE);//????
|
|||
float lightPos[] = { 0.0f,1.0f,0.0f,0.0f }; |
|||
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);//设置方向光的2位置
|
|||
|
|||
float whiteColor[] = { 1.0f, 1.0f, 1.0f, 1.0f }; |
|||
glLightfv(GL_LIGHT0, GL_AMBIENT, whiteColor);//设置环境光
|
|||
|
|||
float ambientMat[] = { 0.07f,0.07f, 0.07f, 1.0f };//设置物体表面材质的反射系数
|
|||
glMaterialfv(GL_FRONT, GL_AMBIENT, ambientMat); |
|||
|
|||
float diffuseMat[] = { 0.4f,0.4f,0.4f,1.0f };//设置漫反射系数
|
|||
|
|||
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMat); |
|||
|
|||
float specularMat[] = { 0.9f,0.9f,0.9f,1.0f };//设置镜面反射系数
|
|||
glMaterialfv(GL_FRONT, GL_SPECULAR, specularMat); |
|||
|
|||
glBegin(GL_QUADS); |
|||
glColor4ub(255, 255, 255, 255); |
|||
glVertex3f(-0.5f, -0.2f, -0.5f); |
|||
glVertex3f(0.5f, -0.2f, -0.5f); |
|||
glVertex3f(0.5f, -0.2f, -1.0f); |
|||
glVertex3f(-0.5f, -0.2f, -1.0f); |
|||
glEnd(); |
|||
} |
|||
|
|||
void DrawTexture() { |
|||
glClearColor(0.1f, 0.4f, 0.6f, 1.0f); |
|||
glClear(GL_COLOR_BUFFER_BIT); |
|||
|
|||
//开启纹理
|
|||
glEnable(GL_TEXTURE_2D); |
|||
//绑定纹理
|
|||
glBindTexture(GL_TEXTURE_2D, texture); |
|||
|
|||
glBegin(GL_QUADS); |
|||
glColor4ub(255, 255, 255, 255); |
|||
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.1f, -0.1f, -0.4f); |
|||
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.1f, -0.1f, -0.4f); |
|||
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.1f, 0.1f, -0.4f); |
|||
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.1f, 0.1f, -0.4f); |
|||
glEnd(); |
|||
} |
|||
|
|||
void DrawDepthBk() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除深度缓冲区和颜色缓存区
|
|||
|
|||
glEnable(GL_DEPTH_TEST);//开启深度测试
|
|||
|
|||
glBegin(GL_QUADS); |
|||
glColor4ub(255, 0, 0, 0); |
|||
glVertex3f(-0.1f, -0.1f, -0.4f); |
|||
glVertex3f(0.1f, -0.1f, -0.4f); |
|||
glVertex3f(0.1f, 0.1f, -0.4f); |
|||
glVertex3f(-0.1f, 0.1f, -0.4f); |
|||
glEnd(); |
|||
|
|||
glBegin(GL_QUADS); |
|||
glColor4ub(0, 255, 0, 0); |
|||
glVertex3f(-0.1f, -0.1f, -0.6f); |
|||
glVertex3f(0.1f, -0.1f, -0.6f); |
|||
glVertex3f(0.1f, 0.1f, -0.6f); |
|||
glVertex3f(-0.1f, 0.1f, -0.6f); |
|||
glEnd(); |
|||
} |
|||
|
|||
void DrawDepth() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除深度缓冲区和颜色缓存区
|
|||
|
|||
//glEnable(GL_DEPTH_TEST);//开启深度测试
|
|||
|
|||
GLuint texture2; |
|||
|
|||
texture2 = CreateTexture2DFromBMP("Res/test.bmp"); |
|||
|
|||
glEnable(GL_TEXTURE_2D); |
|||
glBindTexture(GL_TEXTURE_2D, texture2); |
|||
|
|||
glBegin(GL_QUADS); |
|||
|
|||
|
|||
glColor4ub(255, 255, 255, 255); |
|||
glTexCoord2d(0.0f, 0.0f); glVertex3f(-0.1f, -0.1f, -0.4f); |
|||
glTexCoord2d(1.0f, 0.0f); glVertex3f(0.1f, -0.1f, -0.4f); |
|||
glTexCoord2d(1.0f, 1.0f); glVertex3f(0.1f, 0.1f, -0.4f); |
|||
glTexCoord2d(0.0f, 1.0f); glVertex3f(-0.1f, 0.1f, -0.4f); |
|||
glEnd(); |
|||
|
|||
glBindTexture(GL_TEXTURE_2D, 0); |
|||
glBegin(GL_QUADS); |
|||
glColor4ub(0, 255, 0, 0); |
|||
glVertex3f(-0.1f, -0.1f, -0.6f); |
|||
glVertex3f(0.1f, -0.1f, -0.6f); |
|||
glVertex3f(0.1f, 0.1f, -0.6f); |
|||
glVertex3f(-0.1f, 0.1f, -0.6f); |
|||
glEnd(); |
|||
} |
|||
|
|||
void DrawSkyBox() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除深度缓冲区和颜色缓存区
|
|||
skybox.Draw(); |
|||
|
|||
glEnable(GL_DEPTH_TEST);//开启深度测试
|
|||
glBindTexture(GL_TEXTURE_2D, 0); |
|||
glBegin(GL_QUADS); |
|||
glColor4ub(0, 255, 0, 0); |
|||
glVertex3f(-0.1f, -0.1f, -0.6f); |
|||
glVertex3f(0.1f, -0.1f, -0.6f); |
|||
glVertex3f(0.1f, 0.1f, -0.6f); |
|||
glVertex3f(-0.1f, 0.1f, -0.6f); |
|||
glEnd(); |
|||
|
|||
} |
|||
|
|||
void DrawModel() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除深度缓冲区和颜色缓存区
|
|||
light.Enable(); |
|||
skybox.Draw(); |
|||
model.Draw(); |
|||
ground.Draw(); |
|||
} |
|||
|
|||
void DrawLight() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除深度缓冲区和颜色缓存区
|
|||
light1.Enable(); |
|||
light2.Enable(); |
|||
light3.Enable(); |
|||
ground.Draw(); |
|||
} |
|||
|
|||
void DrawCamera() { |
|||
glClearColor(0, 0, 0, 0); |
|||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除深度缓冲区和颜色缓存区
|
|||
|
|||
float frameTime = GetFrameTime(); |
|||
camera.Update(frameTime); |
|||
|
|||
light1.Enable(); |
|||
light1.Update(camera.mPos.x, camera.mPos.y, camera.mPos.z); |
|||
light2.Enable(); |
|||
light2.Update(camera.mPos.x, camera.mPos.y, camera.mPos.z); |
|||
light3.Enable(); |
|||
light3.Update(camera.mPos.x, camera.mPos.y, camera.mPos.z); |
|||
ground.Draw(); |
|||
} |
|||
|
|||
|
|||
void Draw() { |
|||
DrawCamera(); |
|||
} |
|||
|
|||
void OnKeyDown(char code) |
|||
{ |
|||
switch (code) { |
|||
case 'A': |
|||
camera.mbMoveLeft = true; |
|||
break; |
|||
case 'D': |
|||
camera.mbMoveRight = true; |
|||
break; |
|||
case 'W': |
|||
camera.mbMoveForward = true; |
|||
break; |
|||
case 'S': |
|||
camera.mbMoveBack = true; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void OnKeyUp(char code) |
|||
{ |
|||
switch (code) { |
|||
case 'A': |
|||
camera.mbMoveLeft = false; |
|||
break; |
|||
case 'D': |
|||
camera.mbMoveRight = false; |
|||
break; |
|||
case 'W': |
|||
camera.mbMoveForward = false; |
|||
break; |
|||
case 'S': |
|||
camera.mbMoveBack = false; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void OnMouseMove(float deltaX, float deltaY) |
|||
{ |
|||
float angleRotateByUp = deltaX / 1000.0f; |
|||
float angleRotateByRight = deltaY / 1000.0f; |
|||
camera.Yaw(-angleRotateByUp); |
|||
camera.Picth(-angleRotateByRight); |
|||
} |
@ -0,0 +1,8 @@ |
|||
#pragma once |
|||
#include "ggl.h" |
|||
|
|||
void Init(); |
|||
void Draw(); |
|||
void OnKeyDown(char code); |
|||
void OnKeyUp(char code); |
|||
void OnMouseMove(float deltaX, float deltaY); |
@ -0,0 +1,100 @@ |
|||
#include "skybox.h"
|
|||
#include "utils.h"
|
|||
|
|||
void SkyBox::Init(const char * imageDir) |
|||
{ |
|||
char temp[256]; |
|||
|
|||
memset(temp, 0, 256); |
|||
strcpy(temp, imageDir); |
|||
strcat(temp, "front.bmp"); |
|||
mTextures[0] = CreateTexture2DFromBMP(temp); |
|||
|
|||
memset(temp, 0, 256); |
|||
strcpy(temp, imageDir); |
|||
strcat(temp, "back.bmp"); |
|||
mTextures[1] = CreateTexture2DFromBMP(temp); |
|||
|
|||
memset(temp, 0, 256); |
|||
strcpy(temp, imageDir); |
|||
strcat(temp, "left.bmp"); |
|||
mTextures[2] = CreateTexture2DFromBMP(temp); |
|||
|
|||
memset(temp, 0, 256); |
|||
strcpy(temp, imageDir); |
|||
strcat(temp, "right.bmp"); |
|||
mTextures[3] = CreateTexture2DFromBMP(temp); |
|||
|
|||
memset(temp, 0, 256); |
|||
strcpy(temp, imageDir); |
|||
strcat(temp, "top.bmp"); |
|||
mTextures[4] = CreateTexture2DFromBMP(temp); |
|||
|
|||
memset(temp, 0, 256); |
|||
strcpy(temp, imageDir); |
|||
strcat(temp, "bottom.bmp"); |
|||
mTextures[5] = CreateTexture2DFromBMP(temp); |
|||
|
|||
mFastDrawCall = CreateDisplayList([this]()->void {DrawCommand();}); |
|||
} |
|||
|
|||
void SkyBox::DrawCommand() |
|||
{ |
|||
glDisable(GL_LIGHTING); |
|||
glDisable(GL_DEPTH_TEST); |
|||
glEnable(GL_TEXTURE_2D); |
|||
|
|||
glBindTexture(GL_TEXTURE_2D, mTextures[0]); |
|||
glBegin(GL_QUADS); |
|||
glColor4ub(255, 255, 255, 255); |
|||
glTexCoord2d(0.0f, 0.0f); glVertex3f(-0.5f,-0.5f,-0.5f); |
|||
glTexCoord2d(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, -0.5f); |
|||
glTexCoord2d(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, -0.5f); |
|||
glTexCoord2d(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f); |
|||
glEnd(); |
|||
|
|||
glBindTexture(GL_TEXTURE_2D, mTextures[1]); |
|||
glBegin(GL_QUADS); |
|||
glTexCoord2d(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f); |
|||
glTexCoord2d(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f); |
|||
glTexCoord2d(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, 0.5f); |
|||
glTexCoord2d(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.5f); |
|||
glEnd(); |
|||
|
|||
glBindTexture(GL_TEXTURE_2D, mTextures[2]); |
|||
glBegin(GL_QUADS); |
|||
glTexCoord2d(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f); |
|||
glTexCoord2d(1.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f); |
|||
glTexCoord2d(1.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f); |
|||
glTexCoord2d(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.5f); |
|||
glEnd(); |
|||
|
|||
glBindTexture(GL_TEXTURE_2D, mTextures[3]); |
|||
glBegin(GL_QUADS); |
|||
glTexCoord2d(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, -0.5f); |
|||
glTexCoord2d(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f); |
|||
glTexCoord2d(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, 0.5f); |
|||
glTexCoord2d(0.0f, 1.0f); glVertex3f(0.5f, 0.5f, -0.5f); |
|||
glEnd(); |
|||
|
|||
glBindTexture(GL_TEXTURE_2D, mTextures[4]); |
|||
glBegin(GL_QUADS); |
|||
glTexCoord2d(0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, -0.5f); |
|||
glTexCoord2d(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, -0.5f); |
|||
glTexCoord2d(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, 0.5f); |
|||
glTexCoord2d(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.5f); |
|||
glEnd(); |
|||
|
|||
glBindTexture(GL_TEXTURE_2D, mTextures[5]); |
|||
glBegin(GL_QUADS); |
|||
glTexCoord2d(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f); |
|||
glTexCoord2d(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f); |
|||
glTexCoord2d(1.0f, 1.0f); glVertex3f(0.5f, -0.5f, -0.5f); |
|||
glTexCoord2d(0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, -0.5f); |
|||
glEnd(); |
|||
} |
|||
|
|||
void SkyBox::Draw() |
|||
{ |
|||
glCallList(mFastDrawCall); |
|||
} |
@ -0,0 +1,11 @@ |
|||
#pragma once |
|||
#include "ggl.h" |
|||
|
|||
class SkyBox { |
|||
GLuint mTextures[6]; |
|||
GLuint mFastDrawCall; |
|||
public: |
|||
void Init(const char* imageDir); |
|||
void DrawCommand(); |
|||
void Draw(); |
|||
}; |
@ -0,0 +1,79 @@ |
|||
#include "utils.h"
|
|||
|
|||
unsigned char * DecodeBMP(unsigned char * bmpFileData, int & width, int & height) |
|||
{ |
|||
if (0x4D42 == *((unsigned short*)bmpFileData)) {//通过前两个字节去判断数据是否是BMP数据
|
|||
int pixelDataOffset = *((int*)(bmpFileData + 10));//取出位图像素数据的偏移地址、
|
|||
width = *((int*)(bmpFileData + 18));//获取图片宽度
|
|||
height = *((int*)(bmpFileData + 22));//获取图片宽度
|
|||
|
|||
/*读取图片内容*/ |
|||
unsigned char* pixelData = bmpFileData + pixelDataOffset; |
|||
for (int i = 0; i < width * height * 3; i += 3) { |
|||
unsigned char temp = pixelData[i]; |
|||
//BGR 转换成 RGB
|
|||
pixelData[i] = pixelData[i + 2]; |
|||
pixelData[i + 2] = temp; |
|||
} |
|||
return pixelData; |
|||
} |
|||
return nullptr; |
|||
} |
|||
|
|||
GLuint CreateTexture2D(unsigned char * pixelData, int width, int height, GLenum type) |
|||
{ |
|||
GLuint texture; |
|||
glGenTextures(1, &texture); |
|||
|
|||
//绑定纹理
|
|||
glBindTexture(GL_TEXTURE_2D, texture); |
|||
|
|||
//设置纹理放大/缩小时候数据采集的算法
|
|||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//使用线性过滤
|
|||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);//使用线性过滤
|
|||
|
|||
//设置当纹理坐标大于1.0时候的数据采集方式
|
|||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); |
|||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); |
|||
|
|||
//数据上传到显卡
|
|||
glTexImage2D(GL_TEXTURE_2D, 0, type, width, height, 0, type, GL_UNSIGNED_BYTE, pixelData); |
|||
|
|||
//释放纹理
|
|||
glBindTexture(GL_TEXTURE_2D, 0); |
|||
return texture; |
|||
} |
|||
|
|||
GLuint CreateTexture2DFromBMP(const char * bmpPath) |
|||
{ |
|||
int nFileSize = 0; |
|||
unsigned char* bmpFileContent = LoadFileContent(bmpPath, nFileSize); |
|||
|
|||
if (bmpFileContent == nullptr) { |
|||
return 0; |
|||
} |
|||
|
|||
int bmpWidth = 0; |
|||
int bmpHeight = 0; |
|||
unsigned char* pixelData = DecodeBMP(bmpFileContent, bmpWidth, bmpHeight); |
|||
|
|||
if (bmpWidth == 0) { |
|||
delete bmpFileContent; |
|||
return 0; |
|||
} |
|||
|
|||
GLuint textrue = CreateTexture2D(pixelData, bmpWidth, bmpHeight, GL_RGB); |
|||
|
|||
return textrue; |
|||
} |
|||
|
|||
GLuint CreateDisplayList(std::function<void()> foo) |
|||
{ |
|||
GLuint displayList = glGenLists(1);//申请一个显示列表
|
|||
|
|||
glNewList(displayList, GL_COMPILE); |
|||
foo(); |
|||
glEndList(); |
|||
|
|||
return displayList; |
|||
} |
@ -0,0 +1,9 @@ |
|||
#pragma once |
|||
#include "ggl.h" |
|||
|
|||
unsigned char* LoadFileContent(const char* path, int &filesize); |
|||
unsigned char* DecodeBMP(unsigned char* bmpFileData, int &width, int &height); |
|||
GLuint CreateTexture2D(unsigned char* pixelData, int width, int height, GLenum type); |
|||
GLuint CreateTexture2DFromBMP(const char* bmpPath); |
|||
GLuint CreateDisplayList(std::function<void()>foo); |
|||
float GetFrameTime(); |
@ -0,0 +1,53 @@ |
|||
#include "vector3.h"
|
|||
|
|||
Vector3f::Vector3f(float x, float y, float z) |
|||
{ |
|||
this->x = x; |
|||
this->y = y; |
|||
this->z = z; |
|||
} |
|||
|
|||
Vector3f Vector3f::operator+(Vector3f & r) |
|||
{ |
|||
return Vector3f(x + r.x, y + r.y, z + r.z); |
|||
} |
|||
|
|||
Vector3f Vector3f::operator-(Vector3f & r) |
|||
{ |
|||
return Vector3f(x - r.x, y - r.y, z - r.z); |
|||
} |
|||
|
|||
Vector3f Vector3f::operator*(float scaler) |
|||
{ |
|||
return Vector3f(x*scaler, y*scaler, z*scaler); |
|||
} |
|||
|
|||
float Vector3f::operator*(Vector3f & r) |
|||
{ |
|||
return x *r.x + y * r.y + z*r.z; |
|||
} |
|||
|
|||
void Vector3f::operator=(Vector3f & r) |
|||
{ |
|||
x = r.x; |
|||
y = r.y; |
|||
z = r.z; |
|||
} |
|||
|
|||
void Vector3f::Normalize() |
|||
{ |
|||
float len = Magnitude(); |
|||
x /= len; |
|||
y /= len; |
|||
z /= len; |
|||
} |
|||
|
|||
float Vector3f::Magnitude() |
|||
{ |
|||
return sqrtf(x*x + y*y + z*z); |
|||
} |
|||
|
|||
Vector3f Cross(Vector3f v1, Vector3f v2) |
|||
{ |
|||
return Vector3f(v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x); |
|||
} |
@ -0,0 +1,17 @@ |
|||
#pragma once |
|||
#include "ggl.h" |
|||
|
|||
class Vector3f { |
|||
public: |
|||
float x, y, z; |
|||
Vector3f(float x = 0.0f, float y = 0.0f, float z = 0.f); |
|||
Vector3f operator+(Vector3f &r); |
|||
Vector3f operator-(Vector3f &r); |
|||
Vector3f operator*(float scaler); |
|||
float operator*(Vector3f &r); |
|||
void operator=(Vector3f &r); |
|||
void Normalize(); |
|||
float Magnitude(); |
|||
}; |
|||
|
|||
Vector3f Cross(Vector3f v1, Vector3f v2); |
Write
Preview
Loading…
Cancel
Save
Reference in new issue