Вращение вокруг оси 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{

            }
        }
Другие вопросы по тегам