Debug Unity Project on Android Device

由于工作需要,在C++/Python的主业外,零零散散地与Unity打了些交道。这里记录下在安卓上调试Unity项目的要点。 修改Build Settings 点击File->Build Settings,在Android build setting里勾选“Development Build”和“Script Debugging”。 开启USB调试 Android设备需开启USB调试选项。通常是在系统设置里查看系统信息,多次点击系统版本以启用开发者选项,再到开发者选项里启用USB调试即可。这一步是安卓开发的基础,略过不谈。 连接设备到PC 有线连接 有线连接即通过USB线将设备连接到PC即可。可以通过adb devices命令确定可用的设备。 无线连接 无线连接需要PC和Android设备连接到同一WIFI。 查看设备IP 可以在设备的系统设置里找到IP,通常是在网络的详情里。也可以用ADB查看,终端执行 adb shell ip addr show wlan0 连接到设备 PC终端执行 adb tcpip 5555 adb connect [AndroidDeviceIP]:5555 Attach Unity Debugger 在Android上运行Unity应用后,在Visual Studio中点击“Debug”->“Attach Unity Debugger”: 随后选择对应的Android设备即可 设置Android SDK路径 如果系统中有多个Android SDK版本,在Select Unity Instance中可能不会看到对应的设备,这是因为Visual Studio使用的SDK工具没有对应。 在Unity中,点击Edit->Preferences->External Tools,复制所用的Android SDK工具路径: 随后在Visual Studio中,点击Tool->Options->Tools for Unity->General,设置Preferred Android Sdk Root: 设置完成后,可能需要重新运行Unity应用,才能在Select Unity Instance中找到对应的设备。 Reference Debugging Unity Project On Android Device With Visual Studio – Siddharth Shanker Mishra Cannot Debug on Android Device from Visual Studio - Unity Forum

2023-03-24 · Qiao

mesh里的图着色问题

背景 在用trimesh处理模型时,遇到这样一个问题: 给定一个mesh和一张贴图,如何在mesh的每一个face(即每一个三角面片)上贴上此图? 问题 设置贴图关键是设置顶点的uv坐标,最开始的思路是,先设置贴图的4个角落: uv = np.array([ [0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0], ]) 再建立一个(len(vertices), 2)的numpy数组,遍历时依次填入各角落对应的uv坐标。 这样尝试后,发现mesh的贴图会出现很多奇怪的纹路——这是uv坐标有问题的表现。那问题出现在哪里? 问题在于,mesh的face间会相邻,顶点可能在多个face中存在。因此遍历时,顶点的uv坐标可能覆盖,且同一个face的顶点可能用了相同的uv坐标。这样渲染时就可能是从texture中提取了点或线,而不是提取一个三角面,这些点/线在mesh的face上展开时,就会有异样的纹路。 思路 之前的实现显然少了约束,思考一番后,重新定义问题如下: 给出n个三角形,以及0、1、2、3共四个数,要求每个三角形的顶点都分配一个值,且三角形各个顶点的值不一致。在这些三角形有可能相邻的情况下,如何实现一个分配算法? 拿纸演算了下,发现问题并不太简单。问题的描述又有些冗长,搜索后也没找到思路的火花。抱着试一试的想法,问了下chatGPT,其回答是: 这是一个图着色问题,可以使用图论中的染色算法来解决。 首先,将每个三角形看作一个节点,如果两个三角形有共同的边,则它们之间连一条边。这样得到的图称为三角形图。 对于这个三角形图,可以使用贪心算法来进行染色。具体步骤如下: 将三角形图中的所有节点按照度数从大到小排序。 依次遍历每个节点,将其周围已经染色的节点的颜色从可选颜色列表中删除。 如果所有可选颜色都已经被用过,为当前节点分配一个新的颜色。 继续处理下一个节点,直到所有节点都被染色。 对于本题中的0、1、2、3四个数,可以将它们看作四个颜色,每个三角形的顶点对应一个节点,然后按照上述方法进行染色即可。 需要注意的是,这种染色算法并不能保证一定能够找到一种可行的染色方案。当图中存在奇环(即环的长度为奇数)时,无论使用何种染色算法都无法找到可行的染色方案。因此,在实际应用中,需要对算法进行改进或者针对特定的问题进行分析,以保证能够得到正确的结果。 本来已经做好了chatGPT又会胡诌一番,煞有其事地编出些“算法”。但看到“图着色”的一刻,记忆又涌了上来——我知道它是对的。我怎么会没想到图着色呢?(好吧,图论在工作里遇到的实在太少了) 再复习下图着色: 简述图着色算法的原理与使用 - 掘金 Vertex Coloring – from Wolfram MathWorld 实现 现在首要问题变成了如何生成vertex的图。查看了下trimesh,颇为惊喜地发现trimesh就带了graph模块,并提供了trimesh.graph.vertex_adjacency_graph 函数,其返回一个networkx.Graph结构。 再看networkx, 和其名称一样,是一个专门做图分析的包。那么应当有对经典着色问题的实现?果真有,Coloring — NetworkX 3.0 documentation 剩下的实现变得颇为简单: mesh = trimesh.load('test.obj') texture = cv2.imread('test.png') # 省略其它处理 graph = trimesh.graph.vertex_adjacency_graph(mesh) coloring = nx.coloring.greedy_color(graph, interchange=True) num_colors = max(coloring....

2023-03-16 · Qiao

Ubuntu 18.04上切换高版本GCC工具链

Ubuntu 18.04上切换高版本GCC工具链 添加软件源 $ sudo add-apt-repository ppa:ubuntu-toolchain-r/test 如果此前安装过非系统默认版本的python3,这一步有可能出错,产生类似 $ ModuleNotFoundError: No module named 'apt_pkg' 的错误。解决方法是: $ cd /usr/lib/python3/dist-packages $ sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so 随后用update-alternatives将python3改回使用默认的版本: $ sudo update-alternatives --config python3 # 选择默认的python3版本。在Ubuntu 18.04上,这个版本是 安装工具链 可以通过apt search gcc或在https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test?field.series_filter=bionic 上查看可用的gcc版本。这里选择安装gcc-11 $ sudo apt install gcc-11 g++-11 安装完成后,切换工具链 $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 90 \ --slave /usr/bin/g++ g++ /usr/bin/g++-11 \ --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-11 \ --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-11 \ --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-11 $ sudo upate-alternatives --config gcc # 选择gcc-11 检查版本:...

2023-02-19 · Qiao

为VTK修复vtkOBJReader的一个segfault

Background 测试用PyTorch3D生成的Mesh时,打算用VTK对Mesh做离屏渲染生成图片,结果发现VTK的python binding和C++库都会在vtkOBJReader::Update时崩溃。由于是AI模型生成的OBJ文件,OBJ本身是有可能不太标准的,但用Blender、Open3D、trimesh测试,发现都可以加载该文件。看起来似乎VTK的vtkOBJReader实现不够健壮,遂决定调试一番。 Debug 以导致问题的OBJ文件编写复现demo,目录结构: $ tree . . ├── assets │ ├── rand_0_diffuse.png │ ├── rand_0_normal.png │ ├── rand_0_skin.mtl │ ├── rand_0_skin.obj │ └── rand_0_spec.png ├── CMakeLists.txt └── main.cpp main.cpp: #include <vtkOBJReader.h> int main() { vtkNew<vtkOBJReader> reader; reader->SetFileName("rand_0_skin.obj"); reader->Update(); return 0; } 崩溃堆栈: 1 vtkAOSDataArrayTemplate<float>::GetTuple vtkAOSDataArrayTemplate.txx 275 0x7ffff6ee05e5 2 vtkOBJReader::RequestData vtkOBJReader.cxx 978 0x7ffff7b4c793 3 vtkPolyDataAlgorithm::ProcessRequest vtkPolyDataAlgorithm.cxx 87 0x7ffff28aaec6 4 vtkExecutive::CallAlgorithm vtkExecutive.cxx 734 0x7ffff287faf9 5 vtkDemandDrivenPipeline::ExecuteData vtkDemandDrivenPipeline.cxx 461 0x7ffff2876004 6 vtkCompositeDataPipeline::ExecuteData vtkCompositeDataPipeline....

2023-01-18 · Qiao

解决容器内运行conda的GLIBCXX问题

尝试在容器内运行conda,发现报错如下: conda "ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found" 解决方式 安装libgcc conda install libgcc 如果仍然报错,则 export LD_LIBRARY_PATH=<conda-env-path>/lib:$LD_LIBRARY_PATH conda-env-path替换为conda的目录,核心是通过修改LD_LIBRARY_PATH,让conda的python正确加载conda安装的libstdc++,而非系统的版本 To-Ask 为什么需要配环境变量? 按理来说conda在安装时应当已经修改了bashrc、zshrc等文件,让shell环境里的LD_LIBRARY_PATH带上了conda的lib目录(需要检查下未挂载home目录的容器以确认)。有可能是因为在启动容器时挂载了整个home目录,导致容器内的bash用了host的配置所致。 仔细想想,虽然挂载整个home目录用起来方便,但像shell配置、各类软件的cache本身是应该与host独立的,最好还是挂载home下的特定目录

2023-01-03 · Qiao