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

news2024/11/17 23:46:36

目录

  • 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 function

    Eigen::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 default
        if (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})

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

  • project(name) 表示此项目的名字

  • 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.coloradmin.cn/o/1614450.html

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

相关文章

Python --- 基于Iris flower数据集的kNN分类实战

基于Iris flower数据集的kNN分类实战 Iris data set(鸢尾花数据集简介) 鸢尾花数据集共包含三种鸢尾花&#xff1a;Iris setosa, Iris virginica and Iris versicolor。 Iris setosa&#xff08;山鸢尾&#xff09; Iris virginica&#xff08;维吉尼亚鸢尾 &#xff09; Iris …

本地环境测试

1. 在 Anaconda Navigator 中&#xff0c;打开 Jupyter Notebook &#xff0c;在网页中&#xff0c;点击进入本地环境搭建中创 建的工作目录&#xff0c;点击右上角的 New- 》 Folder &#xff0c;将新出现的 Untitled Folder 选中&#xff0c;并使用左上角 的 Rename 按钮重…

C++ //练习 12.30 定义你自己版本的TextQuery和QueryResult类,并执行12.3.1节(第431页)中的runQueries函数。

C Primer&#xff08;第5版&#xff09; 练习 12.30 练习 12.30 定义你自己版本的TextQuery和QueryResult类&#xff0c;并执行12.3.1节&#xff08;第431页&#xff09;中的runQueries函数。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1…

{“errMsg“:“insertXWebCamera:fail appid privacy api banned“}

问题描述&#xff1a;微信小程序&#xff0c;在体验版本测试时&#xff0c;调用摄像头OK&#xff0c;没有任何问题&#xff0c;部署发布版本后&#xff0c;日志报错内容&#xff1a;{"errMsg":"insertXWebCamera:fail appid privacy api banned"}&#xff…

opencv人脸打马赛克

import cv2def FaceFind(imgPath: str) -> list:image cv2.imread(imgPath)gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)face_cascade cv2.CascadeClassifier(haarcascade_frontalface_default.xml)# 返回人脸坐标列表faces face_cascade.detectMultiScale(gray, scal…

MultiCD工具:创建一个多引导Linux USB驱动器

众所周知&#xff0c;拥有一个可安装多个可用操作系统的 CD 或 USB 驱动器在各种情况下都非常有用。无论是为了快速测试或调试某些内容&#xff0c;还是只是重新安装笔记本电脑或 PC 的操作系统&#xff0c;这都可以为你节省大量时间。 在本文中&#xff0c;将介绍如何使用名为…

高度自定义工业自动化配置:钡铼IOy系列模块广泛应用各行业案例

钡铼IOy系列模块是当今工业自动化领域中备受瞩目的一种设备&#xff0c;其高度自定义的特性使其在各行各业都得到了广泛的应用。无论是在制造业、能源领域还是物流行业&#xff0c;钡铼IOy系列模块都发挥着重要的作用&#xff0c;为企业提高生产效率、降低成本、提升产品质量等…

每日更新的Socks5代理服务推荐

大家好&#xff01;我是一名对于IP代理知识非常熟悉的作者&#xff0c;今天我要为大家介绍的是每日更新的Socks5代理服务推荐。作为一个资深的网络爱好者&#xff0c;我深知在网络世界中保护个人隐私和确保数据安全的重要性。而Socks5代理服务则是一种既能够隐藏我们真实IP地址…

如何获取llama2模型

如何从huggingface快速下载llama2模型_llama2下载-CSDN博客文章浏览阅读1.6k次。【代码】如何从huggingface快速下载模型。_llama2下载https://blog.csdn.net/zh515858237/article/details/131248643?ops_request_misc&request_id&biz_id102&utm_termLlama%202%E6…

代码随想录算法训练营day34

题目&#xff1a;860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球 参考链接&#xff1a;代码随想录 860.柠檬水找零 思路&#xff1a;本题思路比较容易想&#xff0c;主要对于5,10,20三种情况分别讨论&#xff0c;维护三个变量分别记录目前手中三种钞票…

P450焕新而来,室内外两用+路径规划+YOLO点击跟踪,算力高达100TOPS

Prometheus 450&#xff08;简称P450&#xff09;是一款室内室外两用的中型轴距&#xff08;410mm&#xff09;无人机&#xff0c;基于F450基础飞行平台&#xff0c;搭载感知传感器二维平面激光雷达&#xff0c;双目深度相机等&#xff0c;配合软件Prometheus自主无人机系统和S…

GitOps 和 DevOps 有什么区别?

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

OpenStack 入门体验

目录 一、云计算概述 1.1、什么是云计算 1.2、云计算的服务模型 1&#xff09;IaaS 2&#xff09;PaaS 3&#xff09;SaaS 1.3、OpenStack 概述 1&#xff09;OpenStack 起源 2&#xff09;什么是 OpenStack 3&#xff09;OpenStack 优势 二、OpenStack 一…

【1569】jsp学生学籍管理系统Myeclipse开发sqlserver数据库web结构jsp编程计算机网页项目

一、源码特点 jsp 学生学籍管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为sqlserver2…

RuoYi-Vue-Plus ()

一、SaInterceptor 注解鉴权和路由拦截鉴权 拦截器&#xff1a;SaInterceptor 实现类位置&#xff1a; cn.dev33.satoken.interceptor.SaInterceptor 功能&#xff1a;Sa-Token 综合拦截器&#xff0c;提供注解鉴权和路由拦截鉴权能力 /*** 创建一个 Sa-Token 综合拦截器&…

2024年新材料与化学工程国际学术会议(ICNMCE 2024)

2024年新材料与化学工程国际学术会议(ICNMCE 2024) 2024 International Conference on New Materials and Chemical Engineering 一、【会议简介】 2024年新材料与化学工程国际学术会议&#xff0c;将汇集全球顶尖学者&#xff0c;展开一场学术盛宴。 在这次会议上&#xff0c…

Git禁止松散对象loose objects弹窗

打开仓库时&#xff0c;弹窗如图 This repository currently has approximately XXXX loose objects.解决办法&#xff1a;见How to skip “Loose Object” popup when running ‘git gui’ Git v1.7.9 或以上版本&#xff0c;执行git config --global gui.gcwarning false

IDEA更换新版本启动没反应

目前安装了新的IDEA(压缩包方式)&#xff0c;由于老版本的IDEA还在用&#xff0c;所以并没有删除&#xff0c;但是安装完后发现点击idea64.exe后没有反应&#xff0c;于是网上找了好多方法最后解决了 下面是我的解决过程 新版本&#xff1a;IntelliJIdea2024.1 老版本: Intelli…

使用matlab/C语言/verilog分别生成coe文件

之前已经写过一个如何使用matlab生成coe文件&#xff0c;matlab自行运算生成三角波、正弦波等数据&#xff0c;并保存为COE文件。可跳转下面的网址进行查阅。 使用matlab生成正弦波、三角波、方波的COE文件_三角波文件.coe-CSDN博客https://blog.csdn.net/yindq1220/article/d…

如何自动监控WordPress网站的运行状态

近来有不少Hostease的客户来咨询关于监控网站在线情况的方法&#xff0c;确实&#xff0c;尽管我们采取了各方面的措施来维护和保护WordPress网站&#xff0c;网站依然有可能由于一些不可控的原因关闭&#xff0c;这种情况往往事发突然&#xff0c;如果没有提前做好准备&#x…