Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Current »

This is a sample code to create an animation from matrices. Use HPS::MatrixKit::Decompose to get a translation and rotation from that matrix, then make a keyframe for each of those values that occur at tick X and append them to their respective channel's keyframe arrays.
https://docs.techsoft3d.com/hps/latest/build/prog_guide/0306_animation.html#toc_rotation_animations

Language: C++ / mfc_sandbox

void CHPSView::OnUserCode1()
{
	HPS::SegmentKey mySegmentKey = GetCanvas().GetFrontView().GetAttachedModel().GetSegmentKey().Subsegment("shell");
	HPS::SegmentKey mySegmentKeySub = mySegmentKey.Subsegment("sub");

	Point points[8] = { Point(0, 0, 0), Point(2, 0, 0), Point(2, 3, 0), Point(0, 3, 0),
		Point(0, 0, 2), Point(2, 0, 2), Point(2, 3, 2), Point(0, 3, 2) };

	int faceList[30] = { 4, 0, 1, 2, 3,
		4, 1, 5, 6, 2,
		4, 5, 4, 7, 6,
		4, 4, 0, 3, 7,
		4, 3, 2, 6, 7,
		4, 0, 4, 5, 1 };

	mySegmentKeySub.InsertShell(8, points, 30, faceList);
	mySegmentKey.GetModellingMatrixControl().Translate(100, 100, 100);
	mySegmentKey.GetVisibilityControl().SetHardEdges(true);

	GetCanvas().GetFrontView().FitWorld().Update();
}

void CHPSView::OnUserCode2()
{
	AnimationArray animations;
	VectorKeyframeArray vectorKeyframes;
	QuaternionKeyframeArray quaternionKeyframes;

	HPS::MatrixKit matrix1;
	matrix1.Translate(5, 0, 0);
	HPS::Vector vec1, scale1;
	HPS::Quaternion quat1;
	matrix1.Decompose(vec1, scale1, quat1);

	HPS::MatrixKitArray aMatrix;
	int num = 4;
	float deg = 45.0f;
	for (int i = 0; i <= num; ++i)
	{
		HPS::MatrixKit matrix;
		matrix.Rotate(0, 0, deg*i);
		matrix.Translate(5, 0, 0);
		aMatrix.push_back(matrix);
	}

	vectorKeyframes.push_back(VectorKeyframe(0, Vector(0, 0, 0)));
	Quaternion original_rotation(1, 0, 0, 0);
	quaternionKeyframes.push_back(QuaternionKeyframe(0, original_rotation));

	int time = 1;
	for (int i = 0; i <= num; ++i)
	{
		HPS::Vector vec, scale;
		HPS::Quaternion quat;
		aMatrix[i].Decompose(vec, scale, quat);
		vectorKeyframes.push_back(VectorKeyframe(time, vec));
		quaternionKeyframes.push_back(QuaternionKeyframe(time, quat));
		time++;
	}

	VectorSampler vectorSampler;
	vectorSampler.SetInterpolation(HPS::Sampler::InterpolationType::Linear);
	vectorSampler.AddKeyframes(vectorKeyframes);

	QuaternionSampler rotationSampler;
	rotationSampler.SetKeyframes(quaternionKeyframes);
	rotationSampler.SetInterpolation(HPS::Sampler::InterpolationType::Linear);

	HPS::Model model = GetCanvas().GetFrontView().GetAttachedModel();
	KeyPath keyPath;
	keyPath.Append(model.GetSegmentKey().Subsegment("shell").Subsegment("sub"));
	keyPath.Append(model.GetSegmentKey());
	
	Animation translationAnimation = model.CreateAnimation("translation");
	translationAnimation.AddTranslationChannel("translationChannel", keyPath, vectorSampler);
	animations.push_back(translationAnimation);

	Animation rotationAnimation = model.CreateAnimation("rotation");
	rotationAnimation.AddRotationChannel("rotationChannel", keyPath, rotationSampler);
	animations.push_back(rotationAnimation);

	AnimationControl animationControl = GetCanvas().GetFrontView().GetAnimationControl();
	animationControl.SetAnimations(animations);
	animationControl.SetMillisecondsPerTick(500);
	animationControl.Play();
}
99EC8CC2-840D-4E8A-AE63-667D35A5A7C2.MP4

  • No labels