por algum motivo meu código dar t que é idêntico ao código javascript three.js, não funcioona da mesma forma, a esfera no código dart não gira, porém no código three.js sim:

código three.js:

// Configura a cena, câmera e renderizador
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setClearColor(0xffffff, 1); // Define o fundo para branco
document.body.appendChild(renderer.domElement);

// Adiciona uma luz à cena
const light = new THREE.PointLight(0xffffff);
light.position.set(10, 10, 10);
scene.add(light);

// Carrega a textura a partir da URL
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load('https://raw.githubusercontent.com/kyracq/3d-pool/master/assets/ballTextures/10.png');

// Cria uma esfera com a textura aplicada
const geometry = new THREE.SphereGeometry(1, 32, 32);
const material = new THREE.MeshStandardMaterial({ map: texture });
const ball = new THREE.Mesh(geometry, material);
scene.add(ball);

// Posição inicial da câmera
camera.position.z = 5;

// Variáveis para a rotação contínua
const rotationSpeed = 0.1; // Velocidade de rotação

// Variável para o ângulo de rotação (em graus)
let rotationAngle = 45; // Ajuste este valor conforme necessário

// Função para calcular o eixo de rotação a partir do ângulo
function calculateRotationAxis(angle) {
    const radians = angle * (Math.PI / 180);
    
    
    return new THREE.Vector3(Math.cos(radians), Math.sin(radians), 0).normalize();
}

// Eixo de rotação calculado a partir do ângulo
let rotationAxis = calculateRotationAxis(rotationAngle);

// Atualiza o eixo de rotação quando o ângulo mudar
function updateRotationAxis(newAngle) {
    rotationAngle = newAngle;
    rotationAxis = calculateRotationAxis(rotationAngle);
    console.log('a');
}

// Função de animação
function animate() {
    requestAnimationFrame(animate);

    // Aplica a rotação contínua
    ball.rotateOnAxis(rotationAxis, rotationSpeed);

    renderer.render(scene, camera);
}

animate();


código dart:

import 'package:flutter/material.dart';
import 'package:flutter_cube/flutter_cube.dart';
import 'package:flutter/scheduler.dart';
import 'dart:math';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
  late Object ball;
  late Ticker _ticker;
  bool loaded = false;
  double angle = 45;
  double rotationSpeed = 10;

  @override
  void initState() {
    super.initState();
    _ticker = createTicker((elapsed) {
      update(elapsed);
    })
      ..start();
  }

  @override
  void dispose() {
    _ticker.dispose();
    super.dispose();
  }

  Vector3 calculateAxis(double angle) {
    double radians = angle * (pi / 180);

    return Vector3(cos(radians), sin(radians), 0).normalized();
  }

  void update(Duration elapsed) {
    setState(() {
      if (loaded) {
        Vector3 axis = calculateAxis(angle);
        ball.rotation.applyAxisAngle(axis, rotationSpeed);
        ball.updateTransform();
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Rotating 3D Sphere'),
      ),
      body: Center(
        child: Container(
          width: 300,
          height: 300,
          child: Cube(
            onSceneCreated: (Scene scene) {
              scene.camera.zoom = 10;
              ball = Object(
                fileName:
                    'assets/ball.obj', // substitua pelo caminho correto para o seu arquivo .obj
                isAsset: true,
                scale: Vector3.all(
                    1), // ajuste o tamanho da esfera conforme necessário
                rotation: Vector3(90, 90, 0),
                backfaceCulling: false,
              );
              scene.world.add(ball);
              loaded = true;
            },
          ),
        ),
      ),
    );
  }
}