feat(OpenGL): lab 4

This commit is contained in:
iridiumR 2023-06-04 17:17:08 +08:00
parent 0f5bebbdad
commit 2db9fb0cae
45 changed files with 654 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 647 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

BIN
OpenGL/lab4/Images/lz.rgb Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

BIN
OpenGL/lab4/Images/nose.tga Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

BIN
OpenGL/lab4/Images/red.tga Normal file

Binary file not shown.

Binary file not shown.

BIN
OpenGL/lab4/Images/road.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
OpenGL/lab4/Images/skin.tga Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

BIN
OpenGL/lab4/Images/tank.rgb Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

67
OpenGL/lab4/Makefile Normal file
View File

@ -0,0 +1,67 @@
#源文件目录
SRC_DIR := ./
#头文件目录
INC_DIR := ./
#输出文件目录
OUT_DIR := ./build
#目标文件(中间文件)目录
OBJ_DIR :=./build
#链接选项
LDFLAGS := $(shell pkg-config --static --libs glfw3)
LDFLAGS += $(shell pkg-config --static --libs assimp)
LDFLAGS += $(shell pkg-config --static -libs openscenegraph)
# 调试符号
LDFLAGS += -g
#编译工具链
CC := g++
#输出文件命名
OUT := $(OUT_DIR)/hello
#增加所有头文件所在的目录
# INC_DIR += ./include/glad
# INC_DIR += ./include/KHR
#获取头文件目录
CPP_FLAGS := $(foreach dir, $(INC_DIR), -I$(wildcard $(dir)))
#方法一: 将所有源文件的文件目录添加进来就不用每增加一个文件都修改一下makefile文件
#SRC_DIR += ./src/
#获取所有cpp文件名
CPP_SRCS := $(foreach dir, $(SRC_DIR), $(wildcard $(dir)/*.cpp))
#方法二:将增加的文件(带目录)增加到源文件数组中,此操作不用增加源文件目录
# CPP_SRCS += ./src/sub_path1/*.cpp
# CPP_SRCS += ./src/sub_path2/*.cpp
# CPP_SRCS += ./src/sub_path....../*.cpp
# CPP_SRCS += ./src/sub_pathn/*.cpp
#生成所有的目标文件名
OBJ := $(addprefix $(OBJ_DIR)/, $(notdir $(CPP_SRCS:.cpp=.o)))
# 最终目标文件的生成makefile 会将第一个target设为最终生成的目标文件
# 【当然这里可以不是可执行文件,它也可以是.o文件】链接过程
# 这条语句的完全写法应该是:
# ./OUT/xxx.OUT: prerequisites1.o prerequisites2.o prerequisites3.o ...
# g++ prerequisites1.o prerequisites2.o prerequisites3.o ... -o ./OUT/xxx.OUT
$(OUT):$(OBJ)
$(CC) $^ -o $@ $(LDFLAGS)
#将所有的.cpp文件加载到当前的路径中
vpath %.cpp $(sort $(dir $(CPP_SRCS)))
#将所有的源文件编译生成响应的目标文件
$(OBJ_DIR)/%.o:%.cpp
$(CC) $(CPP_FLAGS) -c $< -o $@
nv:$(OUT)
prime-run ./$(OUT)
run:$(OUT)
./$(OUT)
all:$(OUT)
.PHONY:clean
clean:
rm -rf ./${OUT_DIR}/*
rm -rf ./${OBJ_DIR}/*

547
OpenGL/lab4/clock.osgt Normal file
View File

@ -0,0 +1,547 @@
#Ascii Scene
#Version 78
#Generator OpenSceneGraph 2.9.17
osg::MatrixTransform {
UniqueID 1
Name "Clock"
DataVariance STATIC
StateSet TRUE {
osg::StateSet {
UniqueID 2
DataVariance STATIC
ModeList 1 {
GL_LIGHTING ON
}
}
}
Children 3 {
osg::Geode {
UniqueID 3
Name "clockHouse"
DataVariance STATIC
Drawables 1 {
osg::Geometry {
UniqueID 4
Name "clockHouse-geometry"
DataVariance STATIC
StateSet TRUE {
osg::StateSet {
UniqueID 5
DataVariance STATIC
ModeList 3 {
GL_CULL_FACE ON
GL_LIGHTING ON
GL_NORMALIZE OFF|OVERRIDE
}
AttributeList 1 {
osg::Material {
UniqueID 6
Ambient TRUE Front 0.588 0.588 0.588 1 Back 0.588 0.588 0.588 1
Diffuse TRUE Front 1 1 1 1 Back 1 1 1 1
Specular TRUE Front 0 0 0 1 Back 0 0 0 1
Emission TRUE Front 0 0 0 1 Back 0 0 0 1
Shininess TRUE Front 0 Back 0
}
Value OFF
}
TextureModeList 1 {
Data 1 {
GL_TEXTURE_2D ON
}
}
TextureAttributeList 1 {
Data 1 {
osg::Texture2D {
UniqueID 7
WRAP_S REPEAT
WRAP_T REPEAT
WRAP_R CLAMP_TO_EDGE
MIN_FILTER LINEAR_MIPMAP_LINEAR
MAG_FILTER LINEAR
UnRefImageDataAfterApply TRUE
ResizeNonPowerOfTwoHint TRUE
InternalFormatMode USE_S3TC_DXT1_COMPRESSION
Image TRUE {
UniqueID 8
FileName "Images/clockface.JPG"
WriteHint 0 2
DataVariance STATIC
}
}
Value OFF
}
}
}
}
PrimitiveSetList 6 {
DrawElementsUShort GL_TRIANGLE_STRIP 4 {
1 2 0 3
}
DrawElementsUShort GL_TRIANGLE_STRIP 4 {
7 4 6 5
}
DrawElementsUShort GL_TRIANGLE_STRIP 4 {
23 20 22 21
}
DrawElementsUShort GL_TRIANGLE_STRIP 4 {
19 16 18 17
}
DrawElementsUShort GL_TRIANGLE_STRIP 4 {
13 14 12 15
}
DrawElementsUShort GL_TRIANGLE_STRIP 4 {
9 10 8 11
}
}
VertexData {
Array TRUE ArrayID 1 Vec3fArray 24 {
-0.5 -0.05 0
-0.5 0.05 0
0.5 0.05 0
0.5 -0.05 0
-0.5 -0.05 1
0.5 -0.05 1
0.5 0.05 1
-0.5 0.05 1
-0.5 -0.05 0
0.5 -0.05 0
0.5 -0.05 1
-0.5 -0.05 1
0.5 -0.05 0
0.5 0.05 0
0.5 0.05 1
0.5 -0.05 1
0.5 0.05 0
-0.5 0.05 0
-0.5 0.05 1
0.5 0.05 1
-0.5 0.05 0
-0.5 -0.05 0
-0.5 -0.05 1
-0.5 0.05 1
}
Indices FALSE
Binding BIND_PER_VERTEX
Normalize 0
}
NormalData {
Array TRUE ArrayID 2 Vec3fArray 24 {
0 0 -1
0 0 -1
0 0 -1
0 0 -1
0 0 1
0 0 1
0 0 1
0 0 1
0 -1 0
0 -1 0
0 -1 0
0 -1 0
1 0 0
1 0 0
1 0 0
1 0 0
0 1 0
0 1 0
0 1 0
0 1 0
-1 0 0
-1 0 0
-1 0 0
-1 0 0
}
Indices FALSE
Binding BIND_PER_VERTEX
Normalize 0
}
TexCoordData 1 {
Data {
Array TRUE ArrayID 3 Vec2fArray 24 {
1 0
1 1
0 1
0 0
0 0
1 0
1 1
0 1
0 0
1 0
1 1
0 1
0 0
1 0
1 1
0 1
0 0
1 0
1 1
0 1
0 0
1 0
1 1
0 1
}
Indices FALSE
Binding BIND_PER_VERTEX
Normalize 0
}
}
}
}
}
osg::Group {
UniqueID 9
DataVariance STATIC
Children 3 {
osg::MatrixTransform {
UniqueID 10
Name "hours"
DataVariance DYNAMIC
UpdateCallback TRUE {
osg::AnimationPathCallback {
UniqueID 11
DataVariance DYNAMIC
AnimationPath TRUE {
osg::AnimationPath {
UniqueID 12
DataVariance DYNAMIC
TimeControlPointMap 3 {
Time 0 {
Position 0 0 0.5
Rotation 0 -0.707107 -0.707107 0
Scale 1 1 1
}
Time 21600 {
Position 0 0 0.5
Rotation -0.707107 0 0 0.707107
Scale 1 1 1
}
Time 43200 {
Position 0 0 0.5
Rotation 0 0.707107 0.707107 0
Scale 1 1 1
}
}
}
}
}
}
Children 1 {
osg::Geode {
UniqueID 13
Name "hours-GEODE"
DataVariance STATIC
Drawables 1 {
osg::Geometry {
UniqueID 14
Name "hours-Geometry"
DataVariance STATIC
StateSet TRUE {
osg::StateSet {
UniqueID 15
DataVariance STATIC
ModeList 3 {
GL_CULL_FACE ON
GL_LIGHTING ON
GL_NORMALIZE OFF|OVERRIDE
}
AttributeList 1 {
osg::Material {
UniqueID 6
}
Value OFF
}
TextureModeList 1 {
Data 1 {
GL_TEXTURE_2D ON
}
}
TextureAttributeList 1 {
Data 1 {
osg::Texture2D {
UniqueID 16
WRAP_S REPEAT
WRAP_T REPEAT
WRAP_R CLAMP_TO_EDGE
MIN_FILTER LINEAR_MIPMAP_LINEAR
MAG_FILTER LINEAR
UnRefImageDataAfterApply TRUE
ResizeNonPowerOfTwoHint TRUE
InternalFormatMode USE_S3TC_DXT1_COMPRESSION
Image TRUE {
UniqueID 17
FileName "Images/osg64.png"
WriteHint 0 2
DataVariance STATIC
}
}
Value OFF
}
}
}
}
PrimitiveSetList 1 {
DrawArrays GL_TRIANGLES 0 3
}
VertexData {
Array TRUE ArrayID 4 Vec3fArray 3 {
0.02 -0.01 -0.051
-0.02 -0.01 -0.051
0 0.295 -0.051
}
Indices FALSE
Binding BIND_PER_VERTEX
Normalize 0
}
NormalData {
Array TRUE ArrayID 5 Vec3fArray 3 {
0 0 -1
0 0 -1
0 0 -1
}
Indices FALSE
Binding BIND_PER_VERTEX
Normalize 0
}
TexCoordData 1 {
Data {
Array TRUE ArrayID 6 Vec2fArray 3 {
0.5 0.95
0.5 0.95
0.5 0.95
}
Indices FALSE
Binding BIND_PER_VERTEX
Normalize 0
}
}
}
}
}
}
Matrix {
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0.5 1
}
}
osg::MatrixTransform {
UniqueID 18
Name "Minutes"
DataVariance DYNAMIC
UpdateCallback TRUE {
osg::AnimationPathCallback {
UniqueID 19
DataVariance DYNAMIC
AnimationPath TRUE {
osg::AnimationPath {
UniqueID 20
DataVariance DYNAMIC
TimeControlPointMap 3 {
Time 0 {
Position 0 0 0.5
Rotation 0 -0.707107 -0.707107 0
Scale 1 1 1
}
Time 1800 {
Position 0 0 0.5
Rotation -0.707107 0 0 0.707107
Scale 1 1 1
}
Time 3600 {
Position 0 0 0.5
Rotation 0 0.707107 0.707107 0
Scale 1 1 1
}
}
}
}
}
}
Children 1 {
osg::Geode {
UniqueID 21
Name "Minutes-GEODE"
DataVariance STATIC
Drawables 1 {
osg::Geometry {
UniqueID 22
Name "Minutes-Geometry"
DataVariance STATIC
StateSet TRUE {
osg::StateSet {
UniqueID 15
}
}
PrimitiveSetList 1 {
DrawArrays GL_TRIANGLES 0 3
}
VertexData {
Array TRUE ArrayID 7 Vec3fArray 3 {
0.017 -0.01 -0.052
-0.017 -0.01 -0.052
0 0.45 -0.052
}
Indices FALSE
Binding BIND_PER_VERTEX
Normalize 0
}
NormalData {
Array TRUE ArrayID 8 Vec3fArray 3 {
0 0 -1
0 0 -1
0 0 -1
}
Indices FALSE
Binding BIND_PER_VERTEX
Normalize 0
}
TexCoordData 1 {
Data {
Array TRUE ArrayID 9 Vec2fArray 3 {
0.195312 0.195312
0.195312 0.195312
0.195312 0.195312
}
Indices FALSE
Binding BIND_PER_VERTEX
Normalize 0
}
}
}
}
}
}
Matrix {
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0.5 1
}
}
osg::MatrixTransform {
UniqueID 23
Name "Seconds"
DataVariance DYNAMIC
UpdateCallback TRUE {
osg::AnimationPathCallback {
UniqueID 24
DataVariance DYNAMIC
AnimationPath TRUE {
osg::AnimationPath {
UniqueID 25
DataVariance DYNAMIC
TimeControlPointMap 3 {
Time 0 {
Position 0 0 0.5
Rotation 0 -0.707107 -0.707107 0
Scale 1 1 1
}
Time 30 {
Position 0 0 0.5
Rotation -0.707107 0 0 0.707107
Scale 1 1 1
}
Time 60 {
Position 0 0 0.5
Rotation 0 0.707107 0.707107 0
Scale 1 1 1
}
}
}
}
}
}
Children 1 {
osg::Geode {
UniqueID 26
Name "Seconds-GEODE"
DataVariance STATIC
Drawables 1 {
osg::Geometry {
UniqueID 27
Name "Seconds-Geometry"
DataVariance STATIC
StateSet TRUE {
osg::StateSet {
UniqueID 15
}
}
PrimitiveSetList 1 {
DrawArrays GL_TRIANGLES 0 3
}
VertexData {
Array TRUE ArrayID 10 Vec3fArray 3 {
0.01 -0.01 -0.054
-0.01 -0.01 -0.054
0 0.47 -0.054
}
Indices FALSE
Binding BIND_PER_VERTEX
Normalize 0
}
NormalData {
Array TRUE ArrayID 11 Vec3fArray 3 {
0 0 -1
0 0 -1
0 0 -1
}
Indices FALSE
Binding BIND_PER_VERTEX
Normalize 0
}
TexCoordData 1 {
Data {
Array TRUE ArrayID 12 Vec2fArray 3 {
0.804788 0.195312
0.804788 0.195312
0.804788 0.195312
}
Indices FALSE
Binding BIND_PER_VERTEX
Normalize 0
}
}
}
}
}
}
Matrix {
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0.5 1
}
}
}
}
osg::MatrixTransform {
UniqueID 28
Name "BackClockFace"
DataVariance DYNAMIC
Children 1 {
osg::Group {
UniqueID 9
}
}
Matrix {
-1 0 0 0
0 -1 0 0
0 0 1 0
0 0 0 1
}
}
}
}

40
OpenGL/lab4/main.cpp Normal file
View File

@ -0,0 +1,40 @@
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgText/Text>
#include <osgGA/TrackballManipulator>
#include <chrono>
#include <osgGA/GUIEventAdapter>
#include <osgViewer/ViewerEventHandlers>
using namespace std;
using namespace chrono;
auto lastFT = system_clock::now();
auto FT = system_clock::now();
int main(int argc, char** argv)
{
// 创建一个OSG Viewer对象
osgViewer::Viewer viewer;
viewer.setUpViewInWindow(50, 50, 800, 600);
viewer.getCamera()->setClearColor(osg::Vec4(0.2, 0.2, 0.2, 1.0));
viewer.setCameraManipulator(new osgGA::TrackballManipulator);
viewer.addEventHandler(new osgViewer::StatsHandler);//查看帧数 s
// 创建一个OSG Node对象并加载OSG模型
osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("clock.osgt");
// 将Node对象添加到OSG Viewer中
viewer.setSceneData(model);
// 启动OSG Viewer循环
while (!viewer.done())
{
auto thisFT = system_clock::now();
auto FT = duration_cast<microseconds>(thisFT - lastFT);
lastFT = thisFT;
viewer.frame();
}
return 0;
}