当前位置: 首页>>代码示例>>C++>>正文


C++ Quaterniond::Y方法代码示例

本文整理汇总了C++中Quaterniond::Y方法的典型用法代码示例。如果您正苦于以下问题:C++ Quaterniond::Y方法的具体用法?C++ Quaterniond::Y怎么用?C++ Quaterniond::Y使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Quaterniond的用法示例。


在下文中一共展示了Quaterniond::Y方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: fitToLocation

Vector3d CSkeleton::fitToLocation(Joint_handle hJoint, Vector3d target_loc)
{
	Joint_handle hRoot = rootOf(hJoint);
	updateGlobalPostures(hRoot);

	if(hRoot == parents[hJoint])
	{
		joints[hJoint].setOffset(target_loc);
		updateGlobalPostures(hRoot);
		return globals[hJoint].getOffset();
	}

	//updateGlobalPostures(0);
	Joint_handle hParent = parents[hJoint];

	Vector3d dJoint, dTarget;
	Vector3d pJoint, pParent;
	pJoint = getGlobalPosition(hJoint);
	pParent = getGlobalPosition(hParent);
	dJoint = (pJoint - pParent).Normalize();
	dTarget = (target_loc - pParent).Normalize();

	Quaterniond qParent = getGlobalRotation(hParent);
	//	dJoint = cast_to_vector(!qParent*dJoint*qParent);
	//	dTarget = cast_to_vector(!qParent*dTarget*qParent);

	Vector3d axis = Vector3d::Cross(dJoint, dTarget);
	double dot = Vector3d::Dot(dJoint, dTarget);
	double angle = acos(Vector3d::Dot(dJoint, dTarget));

	Quaterniond qtemp = !qParent*Quaterniond(0, axis.X(), axis.Y(), axis.Z())*qParent;
	axis = Vector3d(qtemp.X(), qtemp.Y(), qtemp.Z());

	Quaterniond rot;
	rot.FromAxisAngle(angle, axis.X(), axis.Y(), axis.Z());
	qtemp = rot*Quaterniond(0, dJoint.X(), dJoint.Y(), dJoint.Z())*!rot;
	Vector3d pos(qtemp.X(), qtemp.Y(), qtemp.Z());
	Vector3d err = pos - dTarget;

	if( angle == 0.f ||
		(axis.X() == 0 && axis.Y() == 0 && axis.Z() ==0) ||
		dJoint == dTarget)
		return globals[hJoint].getOffset();
	joints[hParent].Rotate(rot);
	//rotateJoint(hParent, rot);
	updateGlobalPostures(hParent);
	//updateGlobalPostures(0);

	return globals[hJoint].getOffset();
}
开发者ID:princetonpku,项目名称:hccl-archive,代码行数:50,代码来源:Skeleton.cpp

示例2: updateGlobalPostures

void CSkeleton::updateGlobalPostures(Joint_handle hJoint)
{
	if(isRoot(hJoint))
		globals[hJoint] = joints[hJoint];
	else
	{
		size_t parent_idx = parents[hJoint];
		globals[hJoint].setOffset(globals[parent_idx].getOffset());

		Quaterniond q = globals[parent_idx].getRotation();
		Vector3d offset = joints[hJoint].getOffset();
		Quaterniond qtemp = q*Quaterniond(0, offset.X(), offset.Y(), offset.Z())*!q;
		Vector3d pos(qtemp.X(), qtemp.Y(), qtemp.Z());
		globals[hJoint].Translate(pos);
		globals[hJoint].setRotation(q*joints[hJoint].getRotation());
	}
	Joint_handle_iterator jh_it, jh_end = children[hJoint].end();
	for(jh_it = children[hJoint].begin(); jh_it != jh_end; ++jh_it)
	{
		updateGlobalPostures(*jh_it);
	}
}
开发者ID:princetonpku,项目名称:hccl-archive,代码行数:22,代码来源:Skeleton.cpp


注:本文中的Quaterniond::Y方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。