Масштабирование высоты и ширины трансформируемого узла в AR-Core (Ar Fragment) - PullRequest
1 голос
/ 31 марта 2020

В настоящее время я использую AR-Core (фрагмент Ar) , я поместил трансформируемый узел в фрагмент ar, и я могу масштабировать его координаты x, y и z с помощью жеста пинч. Но проблема здесь заключается в изменении масштаба трансформируемого узла, он масштабируется с равной пропорцией. Я хочу масштабировать x, y, z трансформируемого узла отдельно с помощью жеста повышения.

Например, если я выполняю жест в направлении x, то только одна ось x должна масштабировать изменение оси Y должно измениться.

1 Ответ

0 голосов
/ 01 апреля 2020

Я предполагаю, что у вас есть 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), их можно прочитать, но это будет взломом.

...