2024_GAMES101作业环境配置Mac(intel)_VSCode_Clion

目录

  • VSCode
  • Clion
  • CMakeList.txt

VSCode

  1. brew install cmake

  2. 更换下载源为阿里云下载 opencv,不然会很慢

    cd "$(brew --repo)"
    git remote -v 
    cd "$(brew --repo)"  
    git remote set-url origin https://mirrors.aliyun.com/homebrew/brew.git
    cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
    git remote set-url origin https://mirrors.aliyun.com/homebrew/homebrew-core.git
    echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles' >> ~/.bash_profile
    source ~/.bash_profile
    

    其中,git remote -v 表示查看当前下载源

  3. brew install opencv

  4. 用 VSCode 打开作业一文件夹,新建终端

    cd ~/GitProjects/GAMES101/Assignment2 
    mkdir build 
    cd build 
    cmake ../ 
    make
    

    编译成功
    现在是这个样子
    在这里插入图片描述

  5. 之后不要去管那个 opencv 头文件引用失败,也不要去直接点右上角那个运行的按钮

    头文件引用失败是因为 intellisence 工具(用来代码自动填充,文件自动索引)的问题,只要是 CMake 运行成功,那就说明项目配置是正确的,如果要修改,那么需要修改文件 c_cpp_properties.json,具体情况我就不知道了(我没成功)
    .
    右上角运行按钮需要自己再配置调试运行文件,一般是 C++(GDB/LLDB) ,有个 launch.json 文件,如果使用这种方法,里面的参数需要修改

  6. 仍然在终端,输入 ./Rasterizer 即可运行代码,会有一个弹窗,里面是一条白线,因为你还没与实现投影矩阵函数。

  7. 你可以先把整个文件的代码替换为下方代码,再执行一遍流程

#include "Triangle.hpp"
#include "rasterizer.hpp"
#include <eigen3/Eigen/Eigen>
#include <iostream>
#include <opencv2/opencv.hpp>constexpr double MY_PI = 3.1415926;Eigen::Matrix4f get_view_matrix(Eigen::Vector3f eye_pos)
{Eigen::Matrix4f view = Eigen::Matrix4f::Identity();Eigen::Matrix4f translate;  translate << 1, 0, 0, -eye_pos[0], 0, 1, 0, -eye_pos[1], 0, 0, 1,-eye_pos[2], 0, 0, 0, 1;view = translate * view;return view;
}Eigen::Matrix4f get_model_matrix(float rotation_angle)
{Eigen::Matrix4f model = Eigen::Matrix4f::Identity();// TODO: Implement this function// Create the model matrix for rotating the triangle around the Z axis.// Then return it.float a =  rotation_angle / 180.0 * MY_PI;;model << cos(a), -sin(a), 0, 0,sin(a), cos(a), 0, 0,0,  0,  1,  0,0,  0,  0,  1;return model;
}Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,float zNear, float zFar)
{// Students will implement this functionEigen::Matrix4f projection = Eigen::Matrix4f::Identity();// TODO: Implement this function// Create the projection matrix for the given parameters.// Then return it.// 1. 透视投影转为正交投影矩阵float n = zNear;float f = zFar;Eigen::Matrix4f M_persp2Ortho;M_persp2Ortho << n, 0, 0, 0,0, n, 0, 0,0, 0, n + f, -n * f,0, 0, 1, 0;// 2. 正交投影转换到正则立方体float fov = eye_fov * MY_PI / 180.0;float t = -n * tan(fov / 2.);float b = -t;float r = aspect_ratio * t;float l = -r;Eigen::Matrix4f M_ortho, trans, scale;trans << 1, 0,  0,  -(r+l)/2,0, 1,  0,  -(t+b)/2,0, 0,  1,  -(n+f)/2,0, 0,  0,  1;scale << 2/(r-l),   0,  0,  0,0,  2/(t-b),   0,  0,0,  0,  2/(n-f),    0,0,  0,  0,  1;M_ortho =  scale * trans;projection = M_ortho * M_persp2Ortho ;return projection;
}int main(int argc, const char** argv)
{float angle = 0;bool command_line = false;std::string filename = "output.png";if (argc >= 3) {command_line = true;angle = std::stof(argv[2]); // -r by defaultif (argc == 4) {filename = std::string(argv[3]);}}rst::rasterizer r(700, 700);Eigen::Vector3f eye_pos = {0, 0, 5};std::vector<Eigen::Vector3f> pos{{2, 0, -2}, {0, 2, -2}, {-2, 0, -2}};std::vector<Eigen::Vector3i> ind{{0, 1, 2}};auto pos_id = r.load_positions(pos);auto ind_id = r.load_indices(ind);int key = 0;int frame_count = 0;if (command_line) {r.clear(rst::Buffers::Color | rst::Buffers::Depth);r.set_model(get_model_matrix(angle));r.set_view(get_view_matrix(eye_pos));r.set_projection(get_projection_matrix(45, 1, 0.1, 50));r.draw(pos_id, ind_id, rst::Primitive::Triangle);cv::Mat image(700, 700, CV_32FC3, r.frame_buffer().data());image.convertTo(image, CV_8UC3, 1.0f);cv::imwrite(filename, image);return 0;}while (key != 27) {r.clear(rst::Buffers::Color | rst::Buffers::Depth);r.set_model(get_model_matrix(angle));r.set_view(get_view_matrix(eye_pos));r.set_projection(get_projection_matrix(45, 1, 0.1, 50));r.draw(pos_id, ind_id, rst::Primitive::Triangle);cv::Mat image(700, 700, CV_32FC3, r.frame_buffer().data());image.convertTo(image, CV_8UC3, 1.0f);cv::imshow("image", image);key = cv::waitKey(10);std::cout << "frame count: " << frame_count++ << '\n';if (key == 'a') {angle += 10;}else if (key == 'd') {angle -= 10;}}return 0;
}

看看结果是不是
在这里插入图片描述
会发现这个窗口的关闭按钮无法点击,回到 VSCode 的终端,command + c 可以停止(terminate)运行程序,如果是 command + z,挂起(suspend)程序

Clion

直接打开文件夹,之后会提示你选择哪个 CMakeListi.txt 文件,选择项目中的即可,点击运行,出现窗口,点击关闭,结束运行。

CMakeList.txt

cmake_minimum_required(VERSION 3.10)
project(Rasterizer)find_package(OpenCV REQUIRED)set(CMAKE_CXX_STANDARD 17)include_directories(/usr/local/include)add_executable(Rasterizer main.cpp rasterizer.hpp rasterizer.cpp Triangle.hpp Triangle.cpp)
target_link_libraries(Rasterizer ${OpenCV_LIBRARIES})

这个文件能很好适配 mac,看第5行的附加包含目录 /usr/local/include 即可看出

  • project() 表示此项目名

  • include_directories(/usr/local/include) 相当于附加包含目录,能够直接引用该目录下的头文件,即引用该文件夹下的头文件不会标红线

  • add_executable(Rasterizer main.cpp rasterizer.hpp rasterizer.cpp Triangle.hpp Triangle.cpp) 根据传入的四个参数文件,生成项目的可执行文件 Rasterizer

    这个指令非常好用,可以让你在一个 project 中运行多个拥有各自 main() 的 .cpp 文件,适合写 io 题

  • 两行代码主要是让CMake可以使用 opencv2,因为 opencv2 文件被包含在了 opencv4 文件中,如果不添加这两段代码,直接使用 opencv2,编译器无法找到。

    find_package(OpenCV REQUIRED) 
    target_link_libraries(Rasterizer ${OpenCV_LIBRARIES})
    

    (除了这种方法,可以自己手动添加一个 opencv2 的软链接,但没有必要。因为正常安装下,cmake文件中会自动包含有 opencv4 的软链接,如下图。这个里面包含了很多 .cmake 文件,像 OpenCV_DIR, OpenCV_INCLUDE_DIRS, OpenCV_LIBS 这些变量 cmake 都能自动获取到,只要在 CMakeLists.txt 里加上面两行就能正常使用,此信息来自于文章 https://blog.csdn.net/a13602955218/article/details/101625857 的评论区)在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 24.04 LTS (Noble Numbat) 下载

Ubuntu 24.04 LTS (Noble Numbat) 下载 Ubuntu 24.04 LTS 开启 Beta 测试, 正式版即将发布 请访问原文链接&#xff1a;Ubuntu 24.04 LTS (Noble Numbat)&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Ubuntu 24.04 LTS 首个…

如果出现这7个现象,别犹豫,是时候更换你的海外仓系统了

不知不觉&#xff0c;即使是曾经让你觉得很有用的海外仓系统也出现了问题。 曾经看似可以简化海外仓运营的管理系统&#xff0c;现在却难以满足你的需求。你是否注意到你的仓库管理效率低下的情况已经开始蔓延&#xff0c;甚至影响了公司的盈利&#xff1f; 仓库日常的管理工…

力扣(leetcode) 42. 接雨水 (带你逐步思考)

力扣(leetcode) 42. 接雨水 &#xff08;带你逐步思考&#xff09; 链接&#xff1a;https://leetcode.cn/problems/trapping-rain-water/ 难度&#xff1a;hard 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多…

鸿蒙开发踩坑与理解

基于 studio dev3.1,api 9 总结:现在的鸿蒙,感觉就像是用eclipse开发android的时候的android4.0或者4.0以下 持续更新中… 申请next,可能没通过? 没下文了。可能华为还不希望普通开发者进行开发吧。 兼容性问题 鸿蒙4.0,华为mate40E当前版本有黑屏、卡顿问题,客服说a…

【正点原子Linux连载】 第三十三章 Linux CAN驱动实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DLRK3568开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第三十…

Word目录格式的编辑记录

1、整体风格 鼠标右键&#xff0c;编辑域 选择目录&#xff0c;风格可以根据自己的喜好选择古典、优雅、正式等 2、字段、段落样式调整 更新整个目录 加载出样式侧框&#xff0c;选中某一级目录&#xff0c;侧框会定位到其样式 然后修改对应的样式&#xff0c;比如字体和段…

vscode自动生成返回值的快捷键

vscode中类似idea的altenter功能&#xff0c;可以添加返回值 idea中是Introduce local variable&#xff0c; vscode中按下command.(句号) 然后选extract to local variable或者 Assign statement to new local variable都行&#xff0c; 光标在分号前如图&#xff1a; 光标在…

探索直播+电商系统中台架构:连接消费者与商品的智能纽带

随着直播电商的崛起&#xff0c;电商行业进入了全新的智能时代。直播形式的互动性和即时性为消费者提供了全新的购物体验&#xff0c;而电商平台则为商品的展示、销售和配送提供了强大的支持。在这一背景下&#xff0c;直播电商系统中台架构成为了连接消费者与商品的智能纽带&a…

Java基于微信小程序的电影院订票系统,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

C语言简单的数据结构:双向链表的实现

目录&#xff1a; 1.双向链表的结构和初始化1.1双向链表的结构1.2双向链表的初始化 2.双向链表的相关操作2.1双向链表的尾插、打印和头插2.11双向链表的尾插2.12双向链表的打印2.13双向链表的头插 2.2双向链表的尾删和头删2.21双向链表的尾删2.22双向链表的头删 2.3双向链表查找…

前后端系统开发之——文章管理

原文地址&#xff1a;前后端系统开发之——文章管理 - Pleasure的博客 下面是正文内容&#xff1a; 前言 主要使用的技术&#xff1a;前端使用的是Vue.js&#xff0c;后端使用的是SpringBoot。如不雷同可以直接跳过了。 文章管理是这个系统最主要的一个功能也是最常规的一个功…

如何寻找可靠的第三方软件检测机构

随着科技的飞速发展和数字化进程的加速&#xff0c;软件质量成为了企业竞争的关键。为了确保软件的质量和性能&#xff0c;许多企业选择寻找第三方的软件检测机构来进行软件的质量控制和评估。那么&#xff0c;如何找到一家可靠的第三方软件检测机构呢&#xff1f; 1.明确检测…

怎么设置启用远程桌面? 如何让外网电脑远程本地内网?

如何远程控制电脑&#xff1f;最简单实用的方案是开启电脑系统自带的远程桌面功能&#xff0c;如果涉及跨网、内外网互通&#xff0c;可以同时用快解析内网映射外网。下面是方案的具体实施步骤&#xff0c;供大家参考。 怎么打开设置启用远程桌面&#xff1f; 1.在目标需要远…

05—js对象

一、初识对象 JavaScript是面向对象编程&#xff08;Object Oriented Programming&#xff0c;OOP&#xff09;语言。 面对象是一种复合值&#xff1a;它将很多值集合在一起&#xff0c;可通过名字访问这些值。对象也可看做一种无序的数据集合&#xff0c;由若干个“键值对”…

数据库--Sqlite3

1、思维导图 2sqlite3在linux中是实现数据的增删&#xff0c;改 #include<myhead.h> int main(int argc, const char *argv[]) { //1、定义一个数据库句柄指针 sqlite3* ppDb NULL; //2、创建或打开数据库 if(sqlite3_open("./mydb…

通过两道题理解哈夫曼树

哈夫曼树定义 哈夫曼树&#xff08;Huffman Tree&#xff09;&#xff0c;又称最优二叉树&#xff0c;是一种带权路径长度最短的二叉树。所谓带权路径长度是指树中所有的叶子结点的权值乘以其到根结点的路径长度&#xff08;边数&#xff09;。哈夫曼树广泛应用于数据压缩等领…

Centroid-Aware Feature Recalibration for Cancer Grading in Pathology Images论文速读

Centroid-Aware Feature Recalibration for Cancer Grading in Pathology Images 摘要 癌症分级是病理学中的一项重要任务。人工神经网络在计算病理学领域的最新发展表明&#xff0c;这些方法在提高癌症诊断的准确性和质量方面具有巨大潜力。然而&#xff0c;这些方法的稳健性…

面试官最怕你懂的Kafka面试题,一招致胜!

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 目录 一、前言Kafka的优点Kafka的使用场景…

密码学 | 椭圆曲线密码学 ECC 入门(二)

目录 4 椭圆曲线&#xff1a;更好的陷门函数 5 奇异的对称性 6 让我们变得奇特 ⚠️ 原文地址&#xff1a;A (Relatively Easy To Understand) Primer on Elliptic Curve Cryptography ⚠️ 写在前面&#xff1a;本文属搬运博客&#xff0c;自己留着学习。如果你和我一样…

实力认证!亚数产品入选《中国网络安全行业全景图(第十一版)》

2024年4月12日&#xff0c;安全牛第十一版《中国网络安全行业全景图》&#xff08;以下简称“全景图”&#xff09;正式发布。 亚数信息科技&#xff08;上海&#xff09;有限公司&#xff08;以下简称“亚数”&#xff09;成功入选数字证书、加解密、密钥管理三项细分领域。 此…