int TestPtToPtAndCoordStageMotion()
{
	
	int iModule;
	int iError;
	double dX, dY, dZ;

	Path vPath;

	iError=InitNMCModule3Axis (iModule, vPath);

	g_stage.Rotate(180.0);
	g_stage.SetVel(3.0, 3.0, 3.0);
	g_stage.SetAccel(1.0, 1.0, 1.0);

//	g_stage.EnableAmp();
//	g_stage.ResetPos();
//	g_stage.SetPathStatus();

//	g_stage.EnableAmp();
//	g_stage.ResetPos();
//	g_stage.SetPathStatus();
	vPath.SetPathParams(P_60HZ,   //path frequency = 30 Hz
					75,       //Store a minimum of 45 points in the path point buffer
					15000.0,  //X scale - 20000.0 counts per inch
					15000.0,  //Y scale - 20000.0 counts per inch
					15000.0,      //Z scale - 1.0 counts per inch - not used
					0.175);     //acceleration = 1.0 inch/second/second
//	InitServoPathParams(P_30HZ,1, 2, 3);

	vPath.SetOrigin(0.0, 0.0, 0.0); //set the origin to X = 0, Y = 0, Z = 0
	vPath.SetFeedrate(0.175);         //feedrate = 1.0 inches/second
	vPath.SetTangentTolerance(10.0);  //continuous path tangent tolerence = 10 degrees	
	g_stage.InitPathMode(vPath);
	

	BOOL bMotion;
	iError=g_stage.MoveTo(0.0, 0.000, -0.5, true);
	g_stage.GetPos( dX, dY, dZ );
	CreatePath1A_XOffset( dX, dY, dZ, vPath);
	ExecutePath3Axis();
	
	iError=g_stage.MoveTo(1.0, 0.000, 0.000, true);
	iError=g_stage.MoveTo(1.0, 0.000, -0.5, true);

	g_stage.GetPos( dX, dY, dZ );
	CreatePath1A_XOffset( dX, dY, dZ, vPath );
	ExecutePath3Axis();
	
	iError=g_stage.MoveTo(-1.0, 1.000, 0.0, true);
	iError=g_stage.MoveTo(-1.0, 1.000, -0.5, true);
	g_stage.GetPos( dX, dY, dZ );
	CreatePath1A_XOffset( dX, dY, dZ, vPath );
	ExecutePath3Axis();
	
	iError=g_stage.MoveTo(0.0, 0.000, 0.000, true);

	return 0;
};
int TestCoordMotionCircleAtOrigin()
{
	
	int iModule;
	int iError;
	double dX=0.0, dY=0.0, dZ=0.0;
	Path vPath;

	iError=InitNMCModule3Axis (iModule, vPath);

	g_stage.Rotate(180.0);
	g_stage.SetVel(3.0, 3.0, 3.0);
	g_stage.SetAccel(1.0, 1.0, 1.0);

	vPath.SetPathParams(P_60HZ,   //path frequency = 30 Hz
					75,       //Store a minimum of 45 points in the path point buffer
					15000.0,  //X scale - 20000.0 counts per inch
					15000.0,  //Y scale - 20000.0 counts per inch
					15000.0,      //Z scale - 1.0 counts per inch - not used
					0.175);     //acceleration = 1.0 inch/second/second

	vPath.SetOrigin(0.0, 0.0, 0.0); //set the origin to X = 0, Y = 0, Z = 0
	vPath.SetFeedrate(0.175);         //feedrate = 1.0 inches/second
	vPath.SetTangentTolerance(10.0);  //continuous path tangent tolerence = 10 degrees	
	g_stage.InitPathMode(vPath);

	

	
	BOOL bMotion;
	iError=g_stage.MoveTo(2.5, 0.0, 0.0, true);
	g_stage.GetPos( dX, dY, dZ );

	vPath.ClearSegListA(2.5, 0.0, 0.0);    //Clear the segment list and set the
									//  starting point for the path
									//  at X = 0, Y = 1, Z = 0

//
//Add line and arc segments to the path module's segment list for first move
//
	int res;
	res = vPath.AddArcSegA( 0.0, 2.5, 0.0,     //end point of arc: x=1, y=3, z=0
							 0.0, 0.0, 0.0,     //center point of arc: x=1, y=2, z = 0
							 0.0, 0.0, 1.0 );   //normal vector to arc plane: x = 0, y = 0, z = -1
	if (res<0) return -1;
	g_stage.ExecuteCoordMotion(vPath);

	vPath.ClearSegListA(0.0, 2.5, 0.0);    //Clear the segment list and set the
									//  starting point for the path
									//  at X = 0, Y = 1, Z = 0

//
//Add line and arc segments to the path module's segment list for first move
//

	res = vPath.AddArcSegA( -2.5, 0.0, 0.0,     //end point of arc: x=1, y=3, z=0
							 0.0, 0.0, 0.0,     //center point of arc: x=1, y=2, z = 0
							 0.0, 0.0, 1.0 );   //normal vector to arc plane: x = 0, y = 0, z = -1
	if (res<0) return -1;
	g_stage.ExecuteCoordMotion(vPath);


//	ExecutePath3Axis();
	
//	iError=g_stage.MoveTo(-1.0, 1.000, 0.0, true);
//	iError=g_stage.MoveTo(-1.0, 1.000, -0.5, true);
//	g_stage.GetPos( dX, dY, dZ );
//	CreatePath1A_XOffset( dX, dY, dZ );
//	ExecutePath3Axis();
	
	iError=g_stage.MoveTo(0.0, 0.000, 0.000, true);
	return 0;
};
int TestCoordMotionShortPath()
{
	
	int iError;
	int res;
	int iModule;
	Path vPath;

	iError=InitNMCModule3Axis (iModule, vPath);
	if (iModule < 3)
		return -1;
	
	g_stage.Rotate(180.0);
	g_stage.SetVel(3.0, 3.0, 3.0);
	g_stage.SetAccel(1.0, 1.0, 1.0);

	vPath.SetPathParams(P_60HZ,   //path frequency = 30 Hz
					75,       //Store a minimum of 45 points in the path point buffer
					6684.57447,  //X scale - 20000.0 counts per inch
					6684.57447,  //Y scale - 20000.0 counts per inch
					2*6684.57447,      //Z scale - 1.0 counts per inch - not used
					1.0);     //acceleration = 1.0 inch/second/second

	vPath.SetOrigin(0.0, 0.0, 0.0); //set the origin to X = 0, Y = 0, Z = 0
	vPath.SetFeedrate(1.0);         //feedrate = 1.0 inches/second
	vPath.SetTangentTolerance(10.0);  //continuous path tangent tolerence = 10 degrees	
	g_stage.InitPathMode(vPath);
	
	double x,y,z;
//	g_stage.GetPos(x,y,z);
//	InitPathParam(P_60HZ, 60, 
//		          6684.57447, 6684.57447, 2*6684.57447,
//				  1.0,
//				  1.0);

	g_stage.GetPos(x,y,z);
	g_stage.ResetPos();
//Clear the segment list and set the starting point for the path
//  at X = 0, Y = 1, Z = 0
	vPath.ClearSegListA(0,0,0);    

//Add a segment to move to x=0, y=2, z=0
	res = vPath.AddLineSegA(0.0, 1.0, 0.0);    
	if (res<0) return -1;
	
	res = vPath.AddArcSegA( 1.0, 2.0, 0.0,     //end point of arc: x=1, y=2, z=0
							 1.0, 1.0, 0.0,     //center point of arc: x=1, y=1, z = 0
							 0.0, 0.0, -1.0 );   //normal vector to arc plane: x = 0, y = 0, z = -1
	if (res<0) return -1;
	g_stage.ExecuteCoordMotion(vPath);
	
	vPath.ClearSegListA(1.0, 2.0, 0.0);    
	g_stage.GetPos(x,y,z);
	
	res = vPath.AddLineSegA(2.0, 2.0, 0.0);    //line segment endpoint: x=4, y=3, z=0
	if (res<0) return -1;
	
	res = vPath.AddArcSegA( 3.0, 1.0, 0.0,     //end point of arc: x=5, y=2, z=0
							 2.0, 1.0, 0.0,     //center point of arc: x=4, y=2, z = 0
							 0.0, 0.0, -1.0 );   //normal vector to arc plane: x = 0, y = 0, z = -1
	if (res<0) return -1;
	
//line segment endpoint: x=5, y=0, z=0
	res = vPath.AddLineSegA(3.0, 0.0, 0.0);    
	if (res<0) return -1;

//line segment endpoint: x=5, y=0, z=0
	g_stage.ExecuteCoordMotion(vPath);

	vPath.ClearSegListA(3.0, 0.0, 0.0);    
	if (res<0) return -1;

//line segment endpoint: x=5, y=0, z=0
	res = vPath.AddLineSegA(0.0, 0.0, 0.0);    
	if (res<0) return -1;
	g_stage.ExecuteCoordMotion(vPath);
	
	ResetModules(iModule);
	return 0;
};
int TestPtToPtMotionShort()
{

//	NMCSERVO Servo;
	int iModules;
	int iError;
	long lPosition;
	double XPos,YPos,ZPos;
	double CmXPos,CmdYPos,CmdZPos;
	double dCmdXSpeed,dCmdYSpeed,dCmdZSpeed;
	double dCmdXAccel,dCmdYAccel,dCmdZAccel;
	double dVelocity;
	double dXHome, dYHome, dZHome;
	byte byAD;

	iModules=g_stage.Initialize("COM4:");

	SetScaling_3Axis();
	SetPIDGain_3Axis();


	g_stage.SetVel(3.0, 3.0, 3.0);
	g_stage.SetAccel(6.0, 6.0, 6.0);

	g_stage.EnableAmp();
	g_stage.ResetPos();
	g_stage.GetHome( dXHome, dYHome, dZHome);

	BOOL bMotion;
	iError=g_stage.MoveRel(0.00, 0.00, 0.15, true);
	iError=g_stage.MoveRel(0.00, 0.00, 0.15, true);
	iError=g_stage.MoveRel(0.00, 0.00, 0.15, true);
	iError=g_stage.MoveRel(0.15, 0.00, 0.00, true);
	iError=g_stage.MoveRel(0.15, 0.00, 0.00, true);
	iError=g_stage.MoveRel(0.15, 0.00, 0.00, true);
	iError=g_stage.MoveRel(0.00, 0.15, 0.00, true);
	iError=g_stage.MoveRel(0.00, 0.15, 0.00, true);
	iError=g_stage.MoveRel(0.00, 0.15, 0.00, true);
	iError=g_stage.MoveTo(1.00, 1.000, 1.000, true);
	g_stage.GetPos(XPos, YPos, ZPos );
	if ( !((XPos < 1.02) && (XPos > 0.98)) && 
		 !((YPos < 1.02) && (YPos > 0.98)) &&
		 !((ZPos < 1.02) && (ZPos > 0.98))   )
		 MessageBox(NULL, "Error with Position","Error Dialog", 1);

	g_stage.GetHome( dXHome, dYHome, dZHome);

	g_stage.GetCmdAccel(dCmdXSpeed, dCmdYSpeed, dCmdZSpeed);
	g_stage.GetCmdAccel(dCmdXAccel, dCmdYAccel, dCmdZAccel );

	iError=g_stage.MoveTo(0.0, 0.0, 0.0, true);

	g_stage.GetPos(XPos, YPos, ZPos );
	if ( !((XPos < 0.02) && (XPos > -0.02)) && 
		 !((YPos < 0.02) && (YPos > -0.02)) &&
		 !((ZPos < 0.02) && (ZPos > -0.02))   )
		 MessageBox(NULL, "Error with Position","Error Dialog", 1);

	iError=g_stage.MoveTo(0.000, 0.000, 0.000, true);
	g_stage.GetPos(XPos, YPos, ZPos );

	g_stage.GetHome( dXHome, dYHome, dZHome);

	return 0;
}	
int TestPtToPtMotionInPCSWithStage()
{

//	NMCSERVO Servo;
	int iModules;
	int iError;
	long lPosition;
	double dXPosition,dYPosition,dZPosition;
	double dCmdXPosition,dCmdYPosition,dCmdZPosition;
	double dCmdXSpeed,dCmdYSpeed,dCmdZSpeed;
	double dCmdXAccel,dCmdYAccel,dCmdZAccel;
	double dVelocity;
	double dXHome, dYHome, dZHome;
	byte byAD;
	
	iModules=g_stage.Initialize("COM3:");

	SetScaling_3Axis();
	SetPIDGain_3Axis();

	g_stage.Rotate(180.0);

	g_stage.SetVel(3.0, 3.0, 3.0);
	g_stage.SetAccel(1.0, 1.0, 1.0);

	g_stage.EnableAmp();
	g_stage.ResetPos();
	
	g_stage.GetCmdVel(dCmdXSpeed, dCmdYSpeed, dCmdZSpeed);
	g_stage.GetSpeed(dCmdXSpeed, dCmdYSpeed, dCmdZSpeed);
	g_stage.GetCmdAccel(dCmdXAccel, dCmdYAccel, dCmdZAccel );

	
	BOOL bMotion;
	iError=g_stage.MoveTo(0.0, 0.0, 0.0, true);
	g_stage.GetPos(dXPosition, dYPosition, dZPosition );

	double x,y,z;
	x=0.5;y= 0.0;z= 0.0;
	iError=g_stage.MoveTo(x,y,z, true);
	g_stage.GetPos(dXPosition, dYPosition, dZPosition );
	
	x=0.0;y= 0.5;z= 0.0;
	iError=g_stage.MoveTo(x,y,z, true);
	g_stage.GetPos(dXPosition, dYPosition, dZPosition );

	x=-0.5;y= 0.0;z= 0.0;
	iError=g_stage.MoveTo(x,y,z, true);
	g_stage.GetPos(dXPosition, dYPosition, dZPosition );

	x=0.0;y= -0.5;z= 0.0;
	iError=g_stage.MoveTo(x,y,z, true);
	g_stage.GetPos(dXPosition, dYPosition, dZPosition );

	x=0.5;y= 0.5;z= 0.0;
	iError=g_stage.MoveTo(x,y,z, true);
	g_stage.GetPos(dXPosition, dYPosition, dZPosition );

	x=-0.5;y= -0.5;z= 0.0;
	iError=g_stage.MoveTo(x,y,z, true);
	g_stage.GetPos(dXPosition, dYPosition, dZPosition );
	
	x=0.5;y= -0.5;z= 0.0;
	iError=g_stage.MoveTo(x,y,z, true);
	g_stage.GetPos(dXPosition, dYPosition, dZPosition );
	
	x=-0.5;y= 0.5;z= 0.0;
	iError=g_stage.MoveTo(x,y,z, true);
	g_stage.GetPos(dXPosition, dYPosition, dZPosition );

//	iError=Servo.move(-8000,2);
//	do{
//		bMotion=Servo.IsInMotion();
//	}
//	while(bMotion);
//	g_stage.GetHome( dXHome, dYHome, dZHome);

	return 0;
}
示例#6
0
//playerのHit関数
//引数:UnitBase型のポインタ
//(UnitBaseクラスを継承した子クラスの情報が扱える)
//戻り値:HRESULT型-成功かどうか
HRESULT Player::Hit(UnitBase* pTarget)
{
	//ステージとの当たり判定
	if (typeid(*pTarget) == typeid(Stage))
	{
		//pTargetをステージと判断し、stage型にキャスト
		Stage* stage = (Stage*)pTarget;

		//RayCastData型の変数を作る
		RayCastData ray;
		//レイが出る位置
		ray.start = position;
		ray.start.y = position.y+10;

		//レイを向ける方向
		ray.dir = D3DXVECTOR3(0, -1, 0);
		
		//レイの情報を格納したアドレスを渡す
		stage->GetModel()->RayCast(&ray);

		//Rayが当たっているかつ
		//ステージの位置Yがプレイヤー位置Y-1より大きかったら
		if (ray.hit && ray.pos.y >= (position.y - 1) && ground_flg == FALSE)
		{
			jump_flg = TRUE;
			jump_Count = 0;
			ground_flg = TRUE;
			position = ray.pos + D3DXVECTOR3(0, 0.5, 0);
		}
		else if (ground_flg == TRUE)
		{
			position = ray.pos + D3DXVECTOR3(0,0.5,0);
		}

		//目の前にステージがあるかの判定
		ray.start = position;
		D3DXMATRIX matR;
		D3DXMatrixRotationY(&matR, D3DXToRadian(dir));
		D3DXVECTOR3 rayVec = D3DXVECTOR3(0, 0, 1);
		D3DXVec3TransformCoord(&rayVec, &rayVec, &matR);
		ray.dir = rayVec;
		stage->GetModel()->RayCast(&ray);
		if (ray.hit && ray.dist < 2)
		{
				isWallHit = TRUE;
				wallNormal = ray.normal;
		}
		else
		{
			isWallHit = FALSE;
		}

		ray.start = position;
		ray.dir = D3DXVECTOR3(0, 0, -1);
		stage->GetModel()->RayCast(&ray);
		D3DXVECTOR3 v = stage->GetPos() - position;
		//プレイヤーとカメラの間にステージがあるか
		D3DXVECTOR3 pToCdist = camVec-position;
		if (D3DXVec3Length(&v) < D3DXVec3Length(&pToCdist))
		{
			camVec = D3DXVECTOR3(position.x, 5, position.z);
		}

	}
	//敵との当たり判定
	if (typeid(*pTarget) == typeid(Enemy))
	{
		static int count = 0;
		count--;
		Enemy* enemy = (Enemy*)pTarget;				//UnitBase型をEnemy型にキャスト
		BOOL flg = item->Hit(enemy->GetPos());		//アイテムが当たったかどうか
		if (flg)
		{
			enemy->KnockBack();
			count = 100;
		}
		D3DXVECTOR3 v = enemy->GetPos() - position; //プレイヤーから敵に向かうベクトルを求める
		if (D3DXVec3Length(&v) < 2)					//ベクトルの長さが2以下だったら
		{
			if (count >= 0)
			{
				enemy->Kill();
				g_gameScene = SC_CLEAR;
			}
			else
			{
				g_gameScene = SC_GAME_OVER;
			}
		}
	}
	if (typeid(*pTarget) == typeid(Invisible))
	{
		Invisible* invisible = (Invisible*)pTarget;
		D3DXVECTOR3 inTopVec = invisible->GetPos() - position;
		if (D3DXVec3Length(&inTopVec) < 1)
		{
			isInvisible = TRUE;
		}
		else
		{
			isInvisible = FALSE;
		}
	}



	return S_OK;
}