Beispiel #1
0
        public CmdResult Execute(ExtendCmdData cmdData, ref string message)
        {
            var mainForm = cmdData.MainForm as Form;
            var viewForm = cmdData.ViewForm as IViewForm;

            if (viewForm == null)
            {
                return(CmdResult.Cancel);
            }
            var osgView = viewForm.View as ZfOsgViewCtrl;
            var osgObj  = osgView.OsgObj;

            var skelroot = new Skeleton(); // 骨骼动画

            skelroot.setDefaultUpdateCallback();
            var root = new Bone(); // 骨骼

            root.setInvBindMatrixInSkeletonSpace(Matrixd.inverse(Matrixd.translate(-1.0f, 0.0f, 0.0f)));
            root.setName("root");
            var pRootUpdate = new UpdateBone("root"); // 骨骼更新器

            pRootUpdate.getStackedTransforms().push_back(new StackedTranslateElement("translate", new Vec3f(-1.0f, 0.0f, 0.0f)));
            root.setUpdateCallback(pRootUpdate);

            var right0 = new Bone();

            right0.setInvBindMatrixInSkeletonSpace(Matrixd.inverse(Matrixd.translate(0.0f, 0.0f, 0.0f)));
            right0.setName("right0");
            var pRight0Update = new UpdateBone("right0");

            pRight0Update.getStackedTransforms().push_back(new StackedTranslateElement("translate", new Vec3f(1.0f, 0.0f, 0.0f)));
            pRight0Update.getStackedTransforms().push_back(new StackedRotateAxisElement("rotate", new Vec3f(0.0f, 0.0f, 1.0f), 0.0));
            right0.setUpdateCallback(pRight0Update);

            var right1 = new Bone();

            right1.setInvBindMatrixInSkeletonSpace(Matrixd.inverse(Matrixd.translate(1.0f, 0.0f, 0.0f)));
            right1.setName("right1");
            var pRight1Update = new UpdateBone("right1");

            pRight1Update.getStackedTransforms().push_back(new StackedTranslateElement("translate", new Vec3f(1.0f, 0.0f, 0.0f)));
            pRight1Update.getStackedTransforms().push_back(new StackedRotateAxisElement("rotate", new Vec3f(0.0f, 0.0f, 1.0f), 0.0));
            right1.setUpdateCallback(pRight1Update);

            root.addChild(right0);
            right0.addChild(right1);
            skelroot.addChild(root);

            Group scene = new Group();
            BasicAnimationManager manager = new BasicAnimationManager();

            scene.setUpdateCallback(manager);

            Animation anim = new Animation();

            {
                var keys0 = new FloatKeyframeContainer(); // 关键帧容器
                keys0.push_back(new FloatKeyframe(0.0, 0.0f));
                keys0.push_back(new FloatKeyframe(3.0, (float)MathUtil.PI_2));
                keys0.push_back(new FloatKeyframe(6.0, (float)MathUtil.PI_2));
                var sampler = new FloatLinearSampler();        // 线性采样器
                sampler.setKeyframeContainer(keys0);
                var channel = new FloatLinearChannel(sampler); // 通道
                channel.setName("rotate");
                channel.setTargetName("right0");
                anim.addChannel(channel);
            }

            {
                var keys1 = new FloatKeyframeContainer(); // 关键帧容器
                keys1.push_back(new FloatKeyframe(0.0, 0.0f));
                keys1.push_back(new FloatKeyframe(3.0, 0.0f));
                keys1.push_back(new FloatKeyframe(6.0, (float)MathUtil.PI_2));
                var sampler = new FloatLinearSampler();        // 线性采样器
                sampler.setKeyframeContainer(keys1);
                var channel = new FloatLinearChannel(sampler); // 通道
                channel.setName("rotate");
                channel.setTargetName("right1");
                anim.addChannel(channel);
            }
            manager.registerAnimation(anim);
            manager.buildTargetReference();

            // let's start !
            manager.playAnimation(anim);

            // we will use local data from the skeleton
            MatrixTransform rootTransform = new MatrixTransform();

            rootTransform.setMatrix(Matrixf.rotate((float)MathUtil.PI_2, new Vec3f(1.0f, 0.0f, 0.0f)));
            right0.addChild(createAxis());
            right0.setDataVariance(Osg.Object.DataVariance.DYNAMIC);
            right1.addChild(createAxis());
            right1.setDataVariance(Osg.Object.DataVariance.DYNAMIC);
            MatrixTransform trueroot = new MatrixTransform();

            //trueroot.setMatrix(new Matrixf(root.getMatrixInBoneSpace().ptr()));
            trueroot.setMatrix(root.getMatrixInBoneSpace());
            trueroot.addChild(createAxis());
            trueroot.addChild(skelroot);
            trueroot.setDataVariance(Osg.Object.DataVariance.DYNAMIC);
            rootTransform.addChild(trueroot);
            scene.addChild(rootTransform);

            RigGeometry geom  = createTesselatedBox(4, 4.0f);
            Geode       geode = new Geode();

            geode.Name = "2";
            geode.addDrawable(geom);
            skelroot.addChild(geode);
            Vec3Array src = new Vec3Array(geom.getSourceGeometry().getVertexArray());

            geom.setDataVariance(Osg.Object.DataVariance.DYNAMIC);

            initVertexMap(root, right0, right1, geom, src);

            scene.Name = "1";
            osgObj.AddOrReplaceModel("Models", scene);
            osgObj.SetView(ViewMode.ShowAll);

            return(CmdResult.Succeed);
        }
Beispiel #2
0
        public CmdResult Execute(ExtendCmdData cmdData, ref string message)
        {
            var mainForm = cmdData.MainForm as Form;
            var viewForm = cmdData.ViewForm as IViewForm;

            if (viewForm == null)
            {
                return(CmdResult.Cancel);
            }
            var osgView = viewForm.View as ZfOsgViewCtrl;
            var osgObj  = osgView.OsgObj;

            var geode = new Geode();

            geode.addDrawable(new ShapeDrawable(new Box(new Vec3f(0, 0, 0), 0.5f)));
            var trans = new MatrixTransform();

            trans.Name = "AnimatedNode";
            trans.setDataVariance(Osg.Object.DataVariance.DYNAMIC);
            trans.setMatrix(Matrixf.identity());
            trans.addChild(geode);

            var root = new Group();

            root.addChild(trans);

            var grp = new Group()
            {
                Name = "1"
            };

            grp.addChild(root);

            var updatecb = new UpdateMatrixTransform("AnimatedCallback");

            updatecb.getStackedTransforms().push_back(new StackedTranslateElement("position"));
            updatecb.getStackedTransforms().push_back(new StackedRotateAxisElement("euler", new Vec3f(1, 0, 0), 0));
            trans.setUpdateCallback(updatecb);

            var mng = new BasicAnimationManager();

            grp.setUpdateCallback(mng);

            var channelAnimation1 = new Vec3LinearChannel();

            //name of the AnimationUpdateCallback
            channelAnimation1.setTargetName("AnimatedCallback");
            //name of the StackedElementTransform for position modification
            channelAnimation1.setName("position");
            //Create keyframes for (in this case linear) interpolation of a Vec3
            var keyframeContainer = channelAnimation1.getOrCreateSampler().getOrCreateKeyframeContainer();

            keyframeContainer.push_back(new Vec3Keyframe(0, new Vec3f(0, 0, 0)));
            keyframeContainer.push_back(new Vec3Keyframe(2, new Vec3f(1, 1, 0)));
            var anim1 = new Animation();

            anim1.addChannel(channelAnimation1);
            anim1.setPlayMode(Animation.PlayMode.PPONG);

            //define the channel for interpolation of a float angle value
            var channelAnimation2 = new FloatLinearChannel();

            //name of the AnimationUpdateCallback
            channelAnimation2.setTargetName("AnimatedCallback");
            //name of the StackedElementTransform for position modification
            channelAnimation2.setName("euler");
            //Create keyframes for (in this case linear) interpolation of a Vec3
            var keyframeContainer2 = channelAnimation2.getOrCreateSampler().getOrCreateKeyframeContainer();

            keyframeContainer2.push_back(new FloatKeyframe(0, 0));
            keyframeContainer2.push_back(new FloatKeyframe(1.5, (float)(2 * Math.PI)));
            var anim2 = new Animation();

            anim2.addChannel(channelAnimation2);
            anim2.setPlayMode(Animation.PlayMode.LOOP);


            // We register all animation inside the scheduler
            mng.registerAnimation(anim1);
            mng.registerAnimation(anim2);

            //start the animation
            mng.playAnimation(anim1);
            mng.playAnimation(anim2);

            osgObj.AddOrReplaceModel("Models", grp);
            osgObj.SetView(ViewMode.ShowAll);

            return(CmdResult.Succeed);
        }