- 最后登录
- 2014-7-10
- 注册时间
- 2014-6-26
- 阅读权限
- 10
- 积分
- 40
- 纳金币
- 6
- 精华
- 0
|
我用了一个简单的替代方案,替代方案的思路大致如下:
首先,创建一个空max档,在这个max档中设置好了vray的渲染参数,并将单位等信息设置与需要渲染的max档相同。
然后,采用3ds max sdk创建一个utilities插件,该插件有一个执行渲染的按钮,在该按钮的响应函数中执行如下操作:
1、用LoadFromFile加载上一步创建的空max档
2、用MergeFromFile将需要渲染的max档合并至空max档中,这两步的意图就是想让需要渲染的max档可以使用vray渲染器
3、最后采用Interface7接口的OpenRenderer、RendererRenderFrame、CloseRenderer执行渲染工作
示例代码如下:
//加载采用vray渲染器的空max档
std::string fname = "E:/Workstation/FaceIdentify/AssignToVrayRender.max";
Interface7* ip = GetCOREInterface7();
WIN32_FIND_DATA fdt;
HANDLE hFile = FindFirstFile(string2wstring(fname).c_str(), &fdt);
if (hFile != INVALID_HANDLE_VALUE)
{
ip->LoadFromFile(string2wstring(fname).c_str(), TRUE);
}
//将需要渲染的max档合并进来
std::string fname1 = "E:/Workstation/FaceIdentify/Test.max";
WIN32_FIND_DATA fdt1;
HANDLE hFile1 = FindFirstFile(string2wstring(fname1).c_str(), &fdt1);
if (hFile1 != INVALID_HANDLE_VALUE)
{
ip->MergeFromFile(string2wstring(fname1).c_str(), TRUE,TRUE, FALSE,MERGE_DUPS_DELOLD);
}
//获取当前渲染器,也就是vray渲染器
Renderer* render = NULL;
render = GetCOREInterface7()->GetRenderer(RS_Production,true);
//遍历max档中的各节点,获取到相机的节点,用以计算出相机的ViewParams
IGameScene * m_pIgame;
m_pIgame = GetIGameInterface();
IGameConversionManager * cm = GetConversionManager();
cm->SetCoordSystem(IGameConversionManager::IGAME_MAX);
m_pIgame->InitialiseIGame(false);
m_pIgame->SetStaticFrame(0);
int nTopLevelNodeCount = m_pIgame->GetTopLevelNodeCount();
INode* cameraNode = NULL;
for(int loop = 0; loop != nTopLevelNodeCount;loop++)
{
IGameNode * pGameNode = m_pIgame->GetTopLevelNode(loop);
//check for selected state - we deal with targets in the light/camera section
if(pGameNode->IsTarget())
continue;
string sName = wstring2string(pGameNode->GetName());
string::size_type idx = sName.find("Camera");
if (idx != string::npos)
{
cameraNode = pGameNode->GetMaxNode();
break;
}
}
ViewParams vp_;
TimeValue t = ip->GetTime();
//计算出相机的ViewParams
GetViewParams(cameraNode, vp_, t);
//依次调用OpenRenderer、RendererRenderFrame、CloseRenderer完成渲染工作
ip->OpenRenderer(render,&vp_,RENDTYPE_NORMAL,0,0);
BitmapInfo bi;
bi.SetName(_T(""));
bi.SetWidth(640);
bi.SetHeight(480);
bi.SetType(BMM_TRUE_32);
Bitmap* map = TheManager->Create(&bi);
ip->RendererRenderFrame(render,t,map,0,1.0f,0,0);
ip->CloseRenderer(render);
|
|