Я работаю над приложением ios, где мне нужно повернуть 3D-матрицу (3D-объект), просто проведите пальцем по ней. метод i используется для вращенияПоворот 3D-объекта с помощью сенсорных входов в iOS
setRotationMatrix (поплавок, поплавок x, поплавок y, поплавок z, поплавок * матрица);
Однако я не уверен, как использовать значения местоположения x и y для касания, чтобы правильно повернуть 3D-матрицу. Вот код, который я использую
- (IBAction) handlePan: (UIPanGestureRecognizer *) распознаватель {
if(recognizer.state == UIGestureRecognizerStateBegan)
{
panStartPoint = [recognizer locationInView:self];
previousPoint.x = 0;
previousPoint.y = 0;
currentPoint.x = panStartPoint.x;
currentPoint.y = panStartPoint.y;
}
else if(recognizer.state == UIGestureRecognizerStateEnded)
{
panEndPoint = [recognizer locationInView:self];
}
else if (recognizer.state == UIGestureRecognizerStateChanged)
{
previousPoint.x = currentPoint.x;
previousPoint.y = currentPoint.y;
CGPoint instanteneousPoint = [recognizer locationInView:self];
currentPoint.x = instanteneousPoint.x;
currentPoint.y = instanteneousPoint.y;
int xdifference = currentPoint.x - previousPoint.x;
int ydifference = currentPoint.y - previousPoint.y;
if((xdifference <= rotationThreshold *-1) || xdifference >= rotationThreshold) //rotationThreshold = 3;
{
if(xdifference <= rotationThreshold *-1)
{
rotationY = -1.0;
}
else
{
rotationY = 1.0;
}
if((ydifference >= rotationThreshold *-1) && ydifference <= rotationThreshold)
{
rotationX = 0.0;
}
}
if((ydifference <= rotationThreshold *-1) || ydifference >= rotationThreshold)
{
if((ydifference <= rotationThreshold *-1))
{
rotationX = -1.0;
}
else
{
rotationX = 1.0;
}
if((xdifference >= rotationThreshold *-1) && xdifference <= rotationThreshold)
{
rotationY = 0.0;
}
}
if(rotationX != 0.0 || rotationY != 0.0)
{
rotationDegree += 5.0f;
if(rotationDegree >= 360.0f)
{
rotationDegree = 0.0f;
}
ShaderUtils::rotatePoseMatrix(rotationDegree, rotationX, rotationY, rotationZ, &modelViewMatrix.data[0]); //rotationZ = 0;
}}}
Это обеспечивает мне с некоторым поворотом 3D-объекта, но его не так естественно, как это должно быть. Любая помощь будет высоко ценится. Благодарю.
Спасибо skytz. Жест жеста более или менее такой же, как UITOUCH. Как описано в моем коде, я следую точно такой же логике, которую вы описали. И он вращается, но вращение не кажется таким естественным. После поиска в сети в течение бесчисленных часов у меня появилась идея, что для того, чтобы повернуть 3D-объект с 2D-жестом, сначала нужно преобразовать эту матрицу в ее исходное положение, затем найти ее кватернион (что бы это ни было) и умножить их вместе. или что-то типа того. – Waqar