- 私信
|
发表时间 : 2010-4-26 15:46:20
|
浏览 : 4276 评论 : 10
userDefineIsector
可以依据物体表面的点,形成自己的碰撞检测体。
#pragma once
#include "vpIsector.h"
#define PointMaxCount 8192
class vpIsectorUserDefine:public vpIsector
{
public:
//公共成员函数
*/
int VerticeCount;
vuVec3<float> * VerticesAll;
vpIsectorUserDefine(void);
void SetPoint(int PointCount);
// implementation of vpIsector
virtual vpIsector *makeCopy(const vsgu::Options &options) const;
protected:
/**
* Methods inherited from vpIsector
*/
virtual void updateSegments();
private:
VUBASE_HEADER_INCLUDES_COMPOSITE(vpIsectorUserDefine)
};
namespace vsgu {
template<>
inline int copy<vpIsectorUserDefine>(vpIsectorUserDefine* dst,
const vpIsectorUserDefine* src, const vsgu::Options& options)
{
int ret = vsgu::SUCCESS;
if (dst == src) return vsgu::SUCCESS;
if (dst == NULL || src == NULL) return vsgu::FAILURE;
if (!(options[vuBase::getOptionIndex()] &
vuBase::OPTION_IGNORE_BASE_CLASS)) {
ret = vsgu::copy<vpIsectorUserDefine>(dst,src, options);
if (ret != vsgu::SUCCESS) return ret;
}
return vsgu::SUCCESS;
}
template<>
inline bool compare<vpIsectorUserDefine>(const vpIsectorUserDefine* s1,
const vpIsectorUserDefine* s2, const vsgu::Options& options)
{
if (s1 == s2) return true;
if (s1 == NULL || s2 == NULL) return false;
bool bRes = true;
if (!(options[vuBase::getOptionIndex()] &
vuBase::OPTION_IGNORE_BASE_CLASS)) {
bRes = vsgu::compare<vpIsector>(s1,s2, options);
if (!bRes) return bRes;
}
return true;
}
}
#include "StdAfx.h"
#include ".\vpisectoruserdefine.h"
#include "vuAllocArray.h"
#include "vuVec3.h"
#include "vuVec4.h"
VUBASE_SOURCE_INCLUDES_COMPOSITE(vpIsectorUserDefine, vpIsector,
new vpIsectorUserDefine, true, true)
vpIsectorUserDefine::vpIsectorUserDefine(void)
{
// registerInstance(s_classType);
}
vpIsectorUserDefine::~vpIsectorUserDefine(void)
{
// remove the instance from the list
unregisterInstance(s_classType);
}
///////////////////////////////////////////////////////////////////////////
//
// makeCopy / public
//
vpIsector * vpIsectorUserDefine::makeCopy(const vsgu::Options &options) const
{
return vsgu::makeCopy(this, options);
}
void vpIsectorUserDefine::SetPoint(int PointCount)
{
if(PointCount>PointMaxCount)
{
AfxMessageBox("定点个数多于8192,请减少该物体的几何体!");
return ;
}
VerticeCount=PointCount;
VerticesAll= vuAllocArray<vuVec3<float> >::malloc(PointCount);
vuSegment<double> segment;
for (int i=0;i<PointCount;i++)
m_vsIsector->push_back_segment(segment);
// clip end point
m_vsIsector->setClip(vsIsector::CLIP_END);
}
///////////////////////////////////////////////////////////////////////////
//
// updateSegments / protected
//
void vpIsectorUserDefine::updateSegments()
{
float x,y,z;
int i=0;
VerticesAll[0].get(&x,&y,&z);
vuVec3<double> lfb(x,y,z);
m_matrix.transformPoint(&lfb);
for(i=1;i<VerticeCount;i++)
{
VerticesAll.get(&x,&y,&z);
vuVec3<double> lfb2(x,y,z);
m_matrix.transformPoint(&lfb2);
m_vsIsector->setSegment(lfb, lfb2, i);
lfb=lfb2;
}
} |
|