我目前正在开发一个应用程序,其初始目标是实时获取Kinect设备"看到"的环境的3D模型.此信息稍后将用于投影映射,但目前这不是问题.
需要克服几个挑战,即Kinect将安装在移动平台(机器人)上,并且模型生成必须是实时的(或接近它).
经过对该主题的长期研究,我想出了几种可能的(?)架构:
1)使用从Kinect获得的深度数据,将其转换为点云(使用PCL执行此步骤),然后将其转换为网格,然后将其导出到Unity中以进行进一步的工作.
2)使用从Kinect获得的深度数据,将其转换为点云(使用PCL执行此步骤),将其导出到Unity中,然后将其转换为网格.
3)使用已经可以选择创建Mesh模型的KinectFusion,并(以某种方式)自动加载创建到Unity中的Mesh模型.
4)使用OpenNI + ZDK(+包装器)获取深度图并使用Unity生成网格.
老实说,我有点迷失在这里,我的主要问题是实时要求以及被迫集成几个软件组件使这成为棘手的问题.我不知道这些解决方案中是否存在哪些解决方案是可行的,并且关于这些问题的信息/教程并不完全丰富,例如,对于Skeleton跟踪.
任何形式的帮助将不胜感激.
此致,努诺
这应该是一个相当简单的问题要解决,但是我已经尝试了几种方法,但结果总是一样的.
我正在尝试将包含GameObjects的列表复制到另一个列表中.问题是我似乎正在复制引用,因为对原始列表的GameObjects所做的任何更改也会影响新列表中的那些,这是我不想发生的事情.从我所读到的,我正在做一个浅拷贝而不是深拷贝,所以我尝试使用以下代码来克隆每个对象:
public static class ObjectCopier
{
/// <summary>
/// Perform a deep Copy of the object.
/// </summary>
/// <typeparam name="T">The type of object being copied.</typeparam>
/// <param name="source">The object instance to copy.</param>
/// <returns>The copied object.</returns>
public static GameObject Clone<GameObject>(GameObject source)
{
if (!typeof(GameObject).IsSerializable)
{
throw new ArgumentException("The type must be serializable ", "source: " + source);
}
// Don't serialize a null object, simply return the default for that object
/*if (Object.ReferenceEquals(source, null))
{
return default(GameObject);
}*/ …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试实现OpenCV的projectPoints方法的示例.该方法背后的想法是将一组3D点,给定相机的平移/旋转矢量及其失真系数作为输入,输出图像平面中的相应2D点.代码来源如下:
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <string>
std::vector<cv::Point3d> Generate3DPoints();
int main(int argc, char* argv[])
{
// Read 3D points
std::vector<cv::Point3d> objectPoints = Generate3DPoints();
std::vector<cv::Point2d> imagePoints;
cv::Mat intrisicMat(3, 3, cv::DataType<double>::type); // Intrisic matrix
intrisicMat.at<double>(0, 0) = 1.6415318549788924e+003;
intrisicMat.at<double>(1, 0) = 0;
intrisicMat.at<double>(2, 0) = 0;
intrisicMat.at<double>(0, 1) = 0;
intrisicMat.at<double>(1, 1) = 1.7067753507885654e+003;
intrisicMat.at<double>(2, 1) = 0;
intrisicMat.at<double>(0, 2) = 5.3262822453148601e+002;
intrisicMat.at<double>(1, 2) = 3.8095355839052968e+002;
intrisicMat.at<double>(2, 2) = 1;
cv::Mat rVec(3, 1, cv::DataType<double>::type); …Run Code Online (Sandbox Code Playgroud) 我正在尝试学习Unity3D摄像机背后使用的主要概念,特别是它的矩阵,并且有一些怀疑在Unity文档中没有回答afaik:
1)基于OpenGL相机的Unity相机?例如,这里找到的相机上的OpenGL教程可以应用于Unity吗?如果是,那么在表示ModelViewProjection矩阵时,在Unity中我们有:
MVPmatrix = mainCamera.projectionMatrix * mainCamera.worldToCameraMatrix;
Run Code Online (Sandbox Code Playgroud)
其中MVP是4x4矩阵,而在OpenGL中通过以下代码表示:
MVPmatrix = projection * view * model;
Run Code Online (Sandbox Code Playgroud)
为什么两种方法之间存在差异?
3)当将前面提到的MVPmatrix与给定的Vector3 [4]类型相乘时,我们是否正在转换为齐次坐标?
2)如果1)的答案是"否",我在哪里可以获得有关Unity3D相机矩阵的更多信息?