配置vscode+cmake+opencv+eigen参考下文
https://www.cnblogs.com/Janspiry/p/16046691.html
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(Rasterizer VERSION 1.0)
set(CMAKE_C_COMPILER gcc)
set(CMAKE_CXX_COMPILER g++)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE-CXX_STANDARD_REQUIRED True)
# 中文乱码C的解决办法
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fexec-charset=GBK")
# 中文乱码C++ 的解决办法
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fexec-charset=GBK")
find_package(OpenCV REQUIRED)
# 如果 OpenCV 没有找到,CMake 会报错并停止
if(NOT OpenCV_FOUND)
message(FATAL_ERROR "OpenCV not found!")
endif()
include_directories(E:\\mengmeng\\opencv\\opencv\\build\\include)
include_directories(C:\\Program Files (x86)\\Eigen3\\include)
include_directories(E:\\mengmeng\\eigen\\eigen-3.4.0)
link_directories(E:\\mengmeng\\opencv\\opencv\\build\\x64\\vc16\\lib)
add_executable(Rasterizer
main.cpp
Rasterizer.cpp
Triangle.cpp
Rasterizer.hpp
Triangle.hpp)
target_link_libraries(Rasterizer PRIVATE ${OpenCV_LIBRARIES})
target_include_directories(Rasterizer PUBLIC
"${PROJECT_BINARY_DIR}"
)
作业1
// 绕任意轴选择/
Eigen::Matrix4f get_model_any_matrix(Eigen::Vector3d axis, float rotation_angle)
{
Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
Eigen::Vector3f axis_float = axis.cast<float>(); //显式将doubule向量转为float
axis_float.normalize();
float rotation_angle_radians = rotation_angle * (MY_PI / 180.0f);
Eigen::AngleAxis<float> rotation(rotation_angle_radians, axis_float);
Eigen::Matrix3f rotationMatrix = rotation.matrix();
model.block<3, 3>(0, 0) = rotationMatrix;
std::cout << "model的值为:" << model << std::endl;
return model;
}
// 绕z轴旋转
Eigen::Matrix4f get_model_matrix(float rotation_angle)
{
Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
float rotation_angle_radians = rotation_angle * (MY_PI / 180.0f);
Eigen::AngleAxis<float> rotation(rotation_angle_radians , Eigen::Vector3f::UnitZ() );
Eigen::Matrix3f rotationMatrix = rotation.matrix();
model.block<3,3>(0, 0) = rotationMatrix;
std::cout << "model的值为:" << model << std::endl;
return model;
}
// eye_fov 视野垂直角度 aspect_ratio 屏幕宽高比 zNear近裁剪面的距离 zFar远裁剪面距离
Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,
float zNear, float zFar
)
{
Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();
float tanHalfFovy = std::tan(eye_fov * 0.5f * MY_PI / 180.0f);
Eigen::Matrix4f perspectiveMatrix;
perspectiveMatrix << 1.0f / (aspect_ratio * tanHalfFovy), 0.0f, 0.0f, 0.0f,
0.0f, 1.0f / tanHalfFovy, 0.0f, 0.0f,
0.0f, 0.0f, -(zFar + zNear) / (zFar -zNear), -(2.0f * zFar * zNear) / (zFar - zNear),
0.0f, 0.0f, -1.0f, 0.0f;
projection = perspectiveMatrix;
std::cout << "projection的值为:" << projection << std::endl;
return projection;
}
贴个三角形(),
./Rasterizer 45 45 qq.png