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/prog_guide/0306_animation.html?

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

(blue star) Related articles

The content by label feature automatically displays related articles based on labels you choose. To edit options for this feature, select the placeholder and tap the pencil icon.