手把手教你在windows下源码编译Open3D

前言

首先不建议windows下源码编译,需要用C++的可以直接下载官网编译好的版本。熟悉vcpkg的,可以把open3d加到vcpkg使用,参考该博客

1.编译环境

  • cmake >=3.20
  • python >=3.6.0
  • visual studio >=2017

2.编译步骤

mkdir build
cd build

cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_INSTALL_PREFIX="<open3d_install_directory>" ..

填写你的VS版本,例vs2022(17),open3d_install_directory使用当前路径".",最终命令为:

cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_INSTALL_PREFIX="." ..
  • 编译,会出现一系列错误,按照提示解决。重复编译过程直至没有Error提示
cmake --build . --config Release --target ALL_BUILD
  • 安装,生成include和lib
cmake --build . --config Release --target INSTALL

3.编译中的bug

3.1 下载超时问题,ispc、pybind11、open3d_sphinx_theme等

报错信息类似:

 error : downloading 'https://github.com/xxx/'
  • 开vpn手动点击报错链接中的url用浏览器下载,然后复制粘贴到"Open3D-master\3rdparty_downloads"相应的库文件下。
  • 替换相应文件下的未下载完成的文件,例如:下载pybind11-2.6.2.tar.gz改名替换为Open3D-master\3rdparty_downloads\pybind11\v2.6.2.tar.gz。
  • one-20190522.tar.gz 是parallelstl库下的文件 -> 20190522.tar.gz
  • 建议先把boringssl、curl这两个库替换好,curl是下载用的库。下好后可能以上的超时问题会消失一些,博主本人是一个个替换的,最后才根据cmake报错装的curl

3.2 boringssl

这个库的下载路径不存在,所以需要去GitHub下载boringssl-master.zip

  • 解压后用7z压成.tar
  • 把.tar压成gzip
  • 把boringssl-master.tar.gz改名替换boringssl_edfe413_win_amd64.tar.gz

3.3 DirectXMath、DirectXHeaders

fatal: unable to access 'https://github.com/microsoft/DirectXMath.git/': Failed to connect to github.com port 443 aft
  er 21085 ms: Timed out

博主的 curl 下载并编译好后,会自动下载装好。上述方法不行试试,github下载了DirectX-Headers-mains和DirectXMath-main,并解压到build\uvatlas\src\ext_directxheaders和build\uvatlas\src\ext_directxmath

4.验证编译是否成功

随便打开build\bin\examples\Release\下的例程,例如:Draw.exe
在这里插入图片描述

5.新建项目中使用

PS:3d库都是缝合怪

新建一个C++项目

  • 包含Build下的includeinclude\open3d\3rdparty
  • 打开build/open3d.sln 找到 example/cpp中的任意一个项目
    • 库目录添加build\bin\Release路径,然后照抄范例中的附加目录
    • 照抄范例的预处理器,不然会报错fmn重复定义(LNK2005) 等错误
  • 项目需Release-x64的项目,Debug需要重编译
  • 项目->属性->c/c++代码生成 更改成 “多线程(/MT)”
    在这里插入图片描述

插入如下代码:

#include <iostream>
#include "open3d/Open3D.h"

using namespace open3d;

int main(){
	// 从github上下载pcd文件,也可以自己找一个pcd文件
    auto demo_crop_data = data::DemoCropPointCloud();
    auto cloud_ptr = std::make_shared<geometry::PointCloud>();
    if (io::ReadPointCloud(demo_crop_data.GetPointCloudPath(),*cloud_ptr)) {
        utility::LogInfo("Successfully read {}",demo_crop_data.GetPointCloudPath());
    } else {
        utility::LogWarning("Failed to read {}",demo_crop_data.GetPointCloudPath());
        return 1;
    }
    cloud_ptr->NormalizeNormals();
    visualization::DrawGeometries({ cloud_ptr },"PointCloud",1600,900);
}

在这里插入图片描述

6.静态库整合

上面链接的静态库太多,故使用visual studio工具lib.exe(官方文档)进行合并,简化调用流程。由于lib.exe的合并的函数限制,把上面的的静态链接库按照体积分两份。

在这里插入图片描述

6.1 Lib.exe简单使用

输入cmd命令lib.exe /out:xmv1.lib Open3D.lib assimp-vc143-mt.lib 等

可以用python处理之前的链接路径,最后得到所有链接路径(绝对路径)。还没看懂的可以去看看这篇博客

最后多个静态链接合并成xmv1.lib和xmv.lib

6.2 简化后的调用流程

  • 添加头文件,包含build下的includeinclude\open3d\3rdparty

    D:\3rdparty\Open3D-master\build\include
    D:\3rdparty\Open3D-master\build\include\open3d\3rdparty
    
  • 引用链接库

    #pragma comment(lib, "xmv.lib")
    #pragma comment(lib, "xmv1.lib")
    
  • 添加预处理器

    %(PreprocessorDefinitions)
    WIN32
    _WINDOWS
    _CRT_SECURE_NO_WARNINGS
    NDEBUG
    OPEN3D_CXX_STANDARD="14"
    OPEN3D_CXX_COMPILER_ID="MSVC"
    OPEN3D_CXX_COMPILER_VERSION="19.34.31933.0"
    OPEN3D_CUDA_COMPILER_ID=""
    OPEN3D_CUDA_COMPILER_VERSION=""
    ZMQ_STATIC
    BUILD_ISPC_MODULE
    BUILD_GUI
    BUILD_WEBRTC
    WITH_IPPICV
    _GLIBCXX_USE_CXX11_ABI=0
    WINDOWS
    _CRT_SECURE_NO_DEPRECATE
    _CRT_NONSTDC_NO_DEPRECATE
    _SCL_SECURE_NO_WARNINGS
    NOMINMAX
    _USE_MATH_DEFINES
    _ENABLE_EXTENDED_ALIGNED_STORAGE
    __TBB_LIB_NAME=tbb_static
    OPEN3D_STATIC
    GLEW_STATIC
    FMT_HEADER_ONLY=0
    FMT_USE_WINDOWS_H=0
    FMT_STRING_ALIAS=1
    TINYGLTF_IMPLEMENTATION
    STB_IMAGE_IMPLEMENTATION
    STB_IMAGE_WRITE_IMPLEMENTATION
    TINYOBJLOADER_IMPLEMENTATION
    MKL_ILP64
    CMAKE_INTDIR="Release"
    
  • 调用代码

    
    #include <iostream>
    #pragma comment(lib, "xmv.lib")
    #pragma comment(lib, "xmv1.lib")
    
    #include "open3d/Open3D.h"
    
    using namespace open3d;
    
    int main()
    {
        auto demo_crop_data = data::DemoCropPointCloud();
        auto cloud_ptr = std::make_shared<geometry::PointCloud>();
        if (io::ReadPointCloud(demo_crop_data.GetPointCloudPath(),*cloud_ptr)) {
            utility::LogInfo("Successfully read {}",demo_crop_data.GetPointCloudPath());
        } else {
            utility::LogWarning("Failed to read {}",demo_crop_data.GetPointCloudPath());
            return 1;
        }
    
        auto redWoodRGBD = data::SampleRedwoodRGBDImages();
        auto image_ptr = std::make_shared<geometry::Image>();
        if (io::ReadImage(redWoodRGBD.GetColorPaths()[0],*image_ptr)) {
            utility::LogInfo("Successfully read {}",redWoodRGBD.GetColorPaths()[0]);
        } else {
            utility::LogWarning("Failed to read {}",redWoodRGBD.GetColorPaths()[0]);
            return 1;
        }
    }
    
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
构建一个3D游戏引擎的源码需要考虑许多因素,包括图形渲染、物理模拟、碰撞检测、场景管理等。以下是一个简要的步骤: 首先,我们需要选择一个合适的编程语言,如C++或Python,来实现3D游戏引擎。 其次,我们需要设计和实现一个图形渲染器,以便在屏幕上渲染3D场景。这可以通过使用现有的图形库(如OpenGL或DirectX)来实现,也可以自己编写一个简化版本。 接下来,我们需要实现物理模拟,以使3D场景的物体能够逼真地运动和相互作用。这可以通过应用牛顿力学定律和碰撞检测算法来实现。 然后,我们需要设计一个场景管理系统,以便管理和呈现3D场景中的对象。这包括管理场景中的实体、灯光、相机等,并进行相应的渲染和更新。 在实现这些基本功能后,我们可以进一步添加地形生成、粒子系统、动画等高级特性。 在构建3D游戏引擎的过程中,我们需要遵循良好的软件工程原则,如模块化设计、面向对象编程和代码重用,以便使源码具有可维护性和扩展性。 最后,我们需要进行测试和调试,确保游戏引擎能够正确地渲染和模拟3D场景,并具有良好的性能。 总结起来,构建一个3D游戏引擎的源码需要深入了解图形渲染、物理模拟、碰撞检测等原理,并遵循一系列软件工程原则。这是一个庞大且复杂的项目,需要耐心和持续的努力才能完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值