Вращение вокруг оси z через произвольную (x,y) точку в металле
У меня есть плоскость с четырьмя вершинами. Его можно вращать вокруг оси z (0, 0,1).(Добиться, используя матрицу модели в металле). Матрица модели изменяется в зависимости от жеста вращения.
Поэтому мне нужно повернуть плоскость вокруг оси z на произвольную (x,y), где x, y не равно нулю. Это означает вращать плоскость вокруг оси, перпендикулярной плоскости xy, проходящей через (x,y) точка.
Любое предложение, пожалуйста?
1 ответ
Это работает для меня. Здесь метод dragCanvas меняет перевод в модели matix, а rotateCanvas меняет его вращение. Вы можете реализовать свой собственный, который делает то же самое. Метод convertCoodinates системы координат карт в соответствии с описанием в https://developer.apple.com/documentation/metal/hello_triangle
@objc func rotate(rotateGesture: UIRotationGestureRecognizer){
guard rotateGesture.view != nil else { return }
let location = rotateGesture.location(in: self.view)
var rotatingAnchorPoint = convertCoodinates(tapx:location.x , tapy:location.y )
if rotateGesture.state == UIGestureRecognizerState.changed {
print("rotation:\(rotateGesture.rotation)")
renderer?.dargCanvas(axis:float3(Float(rotatingAnchorPoint.x) ,Float(rotatingAnchorPoint.y ),0))
renderer?.rotateCanvas(rotation:Float(rotateGesture.rotation))
renderer?.dargCanvas(axis:float3(Float(-rotatingAnchorPoint.x ) ,Float(-rotatingAnchorPoint.y ),0))
rotateGesture.rotation = 0
} else if rotateGesture.state == UIGestureRecognizerState.began {
}else if rotateGesture.state == UIGestureRecognizerState.ended{
}
}