Я предполагаю, что у вас есть TransformableNode
и по умолчанию ScaleController
масштабирует вашу модель. ScaleController прослушивает PinchGesture
. Он масштабирует узел во всех направлениях, потому что его логика c упрощена, и он вычисляет только одну переменную масштаба, которая применяется для всех направлений:
https://github.com/google-ar/sceneform-android-sdk/blob/master/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/ScaleController.java#L111
@Override
public void onContinueTransformation(PinchGesture gesture) {
currentScaleRatio += gesture.gapDeltaInches() * sensitivity;
float finalScaleValue = getFinalScale();
Vector3 finalScale = new Vector3(finalScaleValue, finalScaleValue, finalScaleValue);
getTransformableNode().setLocalScale(finalScale);
if (currentScaleRatio < -ELASTIC_RATIO_LIMIT
|| currentScaleRatio > (1.0f + ELASTIC_RATIO_LIMIT)) {
gesture.cancel();
}
}
Как вы видите линию finalScale = new Vector3(finalScaleValue, finalScaleValue, finalScaleValue);
. Я бы выделил свой собственный ScaleController
(наследуя от встроенного ScaleController
), который управляет x
, y
, z
пинчами в отдельных переменных. Вам нужно переопределить эту функцию onContinueTransformation
и иметь Vector3 currentScaleVector
и Vector3 finalScaleVector
вместо float
. Затем, когда вы создаете экземпляр TransformableNode , вы можете указать TransformationSystem , и ScaleController
является одной частью этого TransformationSystem
, так что вы передадите свой переопределенный ScaleController в систему .
scaleController = new ScaleController(this, transformationSystem.getPinchRecognizer());
addTransformationController(scaleController);
То, что я сейчас не вижу четко на интерфейсе PinchGesture , как вы получили бы разрыв Vector3
, а не только плавающий. Если pu sh подходит к частным полям (startPosition1
, previousPosition1
), их можно прочитать, но это будет взломом.