这是indexloc提供的服务,不要输入任何密码
Skip to content

Resizing window on Windows causes viewport to scale faster that window size #74

@cret1x

Description

@cret1x

Hi,

Noticed, that when trying to change size of the window, size of the scene changes faster, resulting in either black space around viewport, or getting viewport out of window size:

Original size (when launched):

Image

After changing the size:

Image

Same scene works as intended on web (Edge):

Image

Image

Providing my code:

import 'dart:async';
import 'dart:math' as math;

import 'package:flutter/material.dart';
import 'package:sims_pose_viewer/data/bones.dart';
import 'package:sims_pose_viewer/data/character.dart';
import 'package:sims_pose_viewer/data/pose.dart';
import 'package:sims_pose_viewer/data/sims_skeleton.dart';
import 'package:three_js/three_js.dart' as three;
import 'package:three_js_helpers/three_js_helpers.dart';

class PoseViewer extends StatefulWidget {
  const PoseViewer({super.key});

  @override
  State createState() => PoseViewerState();
}

class PoseViewerState extends State<PoseViewer> {
  final double fov = 60;
  int fps = 0;
  late Timer timer;
  late three.ThreeJS threeJs;
  bool usePerspective = true;

  // Selected character to apply pose
  Character? currentCharacter;
  bool isAnimPlaying = false;

  // List of all skeletons of scene
  List<Character> activeCharacters = [];

  // sidebar
  bool isCharactersCollapsed = true;

  // controls
  late three.OrbitControls controls;

  // Loader for loading mesh
  three.GLTFLoader loader = three.GLTFLoader()..setPath('assets/');
  three.CubeTextureLoader skyboxLoader = three.CubeTextureLoader()..setPath('assets/skybox/');

  @override
  void initState() {
    timer = Timer.periodic(const Duration(seconds: 1), (t) {
      setState(() {
        fps = threeJs.clock.fps;
      });
    });
    threeJs = three.ThreeJS(
      onSetupComplete: () {
        setState(() {});
      },
      windowResizeUpdate: updateCameraFov,
      setup: setup,
      settings: three.Settings(
        useOpenGL: true,
        renderOptions: {
          "minFilter": three.LinearFilter,
          "magFilter": three.LinearFilter,
          "format": three.RGBAFormat,
          "samples": 4,
        },
      ),
    );
    super.initState();
  }

  @override
  void dispose() {
    controls.dispose();
    timer.cancel();
    threeJs.dispose();
    super.dispose();
  }

  void updateCameraFov(Size size) {
    final mqd = MediaQuery.of(context);
    print("Total: ${mqd.size} Texture: $size");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: threeJs.build(),
    );
  }


  void setup() async {
    threeJs.scene = three.Scene();

    final skybox = await skyboxLoader.fromAssetList([
      'right.jpg',
      'left.jpg',
      'top.jpg',
      'bottom.jpg',
      'front.jpg',
      'back.jpg',
    ]);

    threeJs.scene.background = skybox; // three.Color.fromHex32(0x555555);
    threeJs.scene.fog = three.FogExp2(0xcccccc, 0.002);

    threeJs.camera = three.PerspectiveCamera(fov, threeJs.width / threeJs.height, 0.1, 1000);
    threeJs.camera.position.setValues(0, 2, 2);
    threeJs.camera.lookAt(three.Vector3(0, 9, 0));

    controls = three.OrbitControls(threeJs.camera, threeJs.globalKey);

    controls.enableDamping = true; // an animation loop is required when either damping or auto-rotation are enabled
    controls.dampingFactor = 0.05;
    controls.screenSpacePanning = true;
    controls.minDistance = 1;
    controls.maxDistance = 3;
    controls.enableZoom = true;

    controls.maxPolarAngle = math.pi;
    controls.target = three.Vector3(0, 1, 0);

    var grid = GridHelper(10, 10, three.Color(1, 0, 0, 1).hashCode);
    grid.position.setValues(0, 0);
    threeJs.scene.add(grid);

    final ambientLight = three.AmbientLight(0xffffff, 2.0);
    threeJs.scene.add(ambientLight);

    addCharacter();

    threeJs.addAnimationEvent((dt) {
      controls.update();
    });
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions