code, (i know its just a snippet)
Code: Select all
#include <irrlicht.h>
#include <math.h>
using namespace irr;
using namespace core;
using namespace scene;
class CMaxDefLightAnim : public ISceneNodeAnimator
{
public:
CMaxDefLightAnim(ICameraSceneNode* cam) : camera(cam), csoffset(0.5 * sin(PI/6.0), 0.5 * cos(PI/6.0),-cos(PI/6.0)) {}
void animateNode(ISceneNode* node, u32 timeMs)
{
matrix4 camTM, offsetTM;
vector3df wsoffset;
camera->getViewMatrix().getInverse(camTM);
camTM.setTranslation(vector3df(0.0,0.0,0.0));
camTM.transformVect(wsoffset,csoffset);
TransformFromDirVector(-wsoffset, offsetTM);
node->setRotation(offsetTM.getRotationDegrees());
}
virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const {}
virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0) {}
virtual ESCENE_NODE_ANIMATOR_TYPE getType() const { return ESNAT_UNKNOWN; }
virtual ISceneNodeAnimator* createClone(ISceneNode* node, ISceneManager* newManager=0) { return new CMaxDefLightAnim(camera); }
private:
void TransformFromDirVector(const vector3df& dir, matrix4& mat)
{
vector3df up(0.0f,1.0f,0.0f), zaxis, xaxis, yaxis;
zaxis = dir;
zaxis.normalize();
xaxis = up.crossProduct(zaxis);
xaxis.normalize();
yaxis = zaxis.crossProduct(xaxis);
mat[0] = xaxis.X; mat[1] = xaxis.Y; mat[2] = xaxis.Z; mat[3] = 0;
mat[4] = yaxis.X; mat[5] = yaxis.Y; mat[6] = yaxis.Z; mat[7] = 0;
mat[8] = zaxis.X; mat[9] = zaxis.Y; mat[10] = zaxis.Z; mat[11] = 0;
mat[12] = 0; mat[13] = 0; mat[14] = 0; mat[15] = 1;
}
vector3df csoffset;
ICameraSceneNode* camera;
};usage.
Code: Select all
ICameraSceneNode* cam = smgr->addCameraSceneNodeMaya();
ILightSceneNode* lnode = smgr->addLightSceneNode(smgr->getRootSceneNode(),vector3df(0,0,0));
lnode->setLightType(ELT_DIRECTIONAL);
ISceneNodeAnimator* anim = new CMaxDefLightAnim(cam);
if(anim)
{
lnode->addAnimator(anim);
anim->drop();
}