初学者为Unity3D构建简单的Kinect V2插件时遇到的问题 [英] Problems for a beginner in building a simple Kinect V2 plugin for Unity3D

查看:95
本文介绍了初学者为Unity3D构建简单的Kinect V2插件时遇到的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好, 
$


我需要在Unity3D项目中进行面部轮换,所以,我正在尝试构建一个简单的Unity插件,但是我我是初学者,我需要帮助!
$


我创建了一个本机C ++,它构建了一个dll文件,我应该将它包装在Unity的C#包装中。  ;
$


在C ++代码中,我有这段代码片段(取自Kinect SDK):

Hello, 

I need face rotation in my Unity3D project, so, I'm trying to build a simple unity plugin, but I'm a beginner in that and I need help!

I have created a native C++ that builds a dll file that I should wrap in a C# wrapper to Unity. 

In that C++ code, I have this code snippet (taken from Kinect SDK):

#if _MSC_VER // this is defined when compiling with Visual Studio
#define EXPORT_API __declspec(dllexport) // Visual Studio needs annotating exported functions with this
#else
#define EXPORT_API // XCode does not need annotating exported functions, so define is empty
#endif


#include "stdafx.h"
#include "resource.h"
#include <iostream>

extern "C"
{
	HRESULT EXPORT_API InitializeDefaultSensor()
	{
		IKinectSensor*          m_pKinectSensor;
		IFaceFrameSource*		m_pFaceFrameSources[BODY_COUNT];
		IFaceFrameReader*		m_pFaceFrameReaders[BODY_COUNT];
		IColorFrameReader*      m_pColorFrameReader;
		IBodyFrameReader*       m_pBodyFrameReader;

		static const DWORD c_FaceFrameFeatures =
			FaceFrameFeatures::FaceFrameFeatures_BoundingBoxInColorSpace
			| FaceFrameFeatures::FaceFrameFeatures_PointsInColorSpace
			| FaceFrameFeatures::FaceFrameFeatures_RotationOrientation
			| FaceFrameFeatures::FaceFrameFeatures_Happy
			| FaceFrameFeatures::FaceFrameFeatures_RightEyeClosed
			| FaceFrameFeatures::FaceFrameFeatures_LeftEyeClosed
			| FaceFrameFeatures::FaceFrameFeatures_MouthOpen
			| FaceFrameFeatures::FaceFrameFeatures_MouthMoved
			| FaceFrameFeatures::FaceFrameFeatures_LookingAway
			| FaceFrameFeatures::FaceFrameFeatures_Glasses
			| FaceFrameFeatures::FaceFrameFeatures_FaceEngagement;

		
		HRESULT hr;

		hr = GetDefaultKinectSensor(&m_pKinectSensor);
		if (FAILED(hr))
		{
			return hr;
		}

		if (m_pKinectSensor)
		{
			// Initialize Kinect and get color, body and face readers
			IColorFrameSource* pColorFrameSource = nullptr;
			IBodyFrameSource* pBodyFrameSource = nullptr;

			hr = m_pKinectSensor->Open();

			if (SUCCEEDED(hr))
			{
				std::cout << "sensor opened" << std::endl;
				hr = m_pKinectSensor->get_ColorFrameSource(&pColorFrameSource);
			}

			if (SUCCEEDED(hr))
			{
				std::cout << "color frame source got" << std::endl;
				hr = pColorFrameSource->OpenReader(&m_pColorFrameReader);
			}

			if (SUCCEEDED(hr))
			{
				std::cout << "color frame source reader opened" << std::endl;
				hr = m_pKinectSensor->get_BodyFrameSource(&pBodyFrameSource);
			}

			if (SUCCEEDED(hr))
			{
				std::cout << "body frame source got" << std::endl;
				hr = pBodyFrameSource->OpenReader(&m_pBodyFrameReader);
			}

			if (SUCCEEDED(hr))
			{
				std::cout << "body frame source reader opened" << std::endl;
				// create a face frame source + reader to track each body in the fov
				for (int i = 0; i < BODY_COUNT; i++)
				{
					if (SUCCEEDED(hr))
					{

						// create the face frame source by specifying the required face frame features
						// the next statement return failed HRESULT if you wrap it as unity plugin, but it works if in a console windows app!
						hr = CreateFaceFrameSource(m_pKinectSensor, 0, c_FaceFrameFeatures, &m_pFaceFrameSources[i]);
					}
					if (SUCCEEDED(hr))
					{
						// open the corresponding reader
						hr = m_pFaceFrameSources[i]->OpenReader(&m_pFaceFrameReaders[i]);
					}
				}
			}

			SafeRelease(pColorFrameSource);
			SafeRelease(pBodyFrameSource);
		}

		if (!m_pKinectSensor || FAILED(hr))
		{
			// SetStatusMessage(L"No ready Kinect found!", 10000, true);
			return E_FAIL;
		}

		return hr;
	}
}




问题是:这一行上面的代码:

The problem is: this line of code from above:

hr = CreateFaceFrameSource(m_pKinectSensor, 0, c_FaceFrameFeatures, &m_pFaceFrameSources[i]);

返回FAILED(hr),但奇怪的是,如果你构建作为Console应用程序的解决方案,它的工作原理!

returns FAILED(hr), but the strange thing is that if you build the solution as a Console application, it works!

也许我不擅长构建插件,但我真的需要帮助。

maybe I'm not good at building a plugin, but I really need help.

谢谢..

推荐答案

您可能遇到来自.Net api的编组问题。您是否传递了有效的跟踪用户ID?
You may have an issue with marshalling from the .Net api. Are you passing in a valid tracked user id?


这篇关于初学者为Unity3D构建简单的Kinect V2插件时遇到的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆