[flutter] 플러터 Stepper를 사용하여 사용자가 선택한 캐릭터 모델의 크기를 조절하는 3D 모델링 애플리케이션을 만들어보자.

소개

이번 프로젝트에서는 플러터의 Stepper 위젯을 활용하여 사용자가 선택한 캐릭터 모델의 크기를 조절할 수 있는 3D 모델링 애플리케이션을 만들어보겠습니다. 사용자는 Stepper를 통해 각각의 단계에서 캐릭터의 크기를 조정할 수 있으며, 이를 통해 원하는 형태의 3D 모델을 만들어볼 수 있습니다.

시작하기 전에

프로젝트 설정

먼저, Flutter 프로젝트를 생성합니다. 터미널 또는 명령 프롬프트에서 다음 명령을 실행합니다.

flutter create 3d_modeling_app

프로젝트가 생성되었다면, lib/main.dart 파일을 열어서 기본 코드를 삭제하고 다음과 같이 작성합니다.

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '3D Modeling App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  // TODO: Implement Stepper and 3D model

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('3D Modeling App'),
      ),
      body: Center(
        child: Container(
          child: Text('Welcome to 3D Modeling App'),
        ),
      ),
    );
  }
}

Stepper 추가하기

_MyHomePageState 클래스의 build 메서드에서, Stepper 위젯을 추가해보겠습니다. Stepper는 여러 단계(steps)로 구성된 위젯입니다. 각 단계마다 사용자가 캐릭터 모델의 크기를 조정할 수 있도록 해보겠습니다.

class _MyHomePageState extends State<MyHomePage> {
  int _currentStep = 0;
  List<double> _characterSizes = [1.0, 1.0, 1.0]; // 초기 크기 설정

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('3D Modeling App'),
      ),
      body: Center(
        child: Column(
          children: [
            Stepper(
              currentStep: _currentStep,
              onStepTapped: (step) {
                setState(() {
                  _currentStep = step;
                });
              },
              onStepContinue: () {
                setState(() {
                  if (_currentStep < _characterSizes.length - 1) {
                    _currentStep++;
                  }
                });
              },
              onStepCancel: () {
                setState(() {
                  if (_currentStep > 0) {
                    _currentStep--;
                  }
                });
              },
              steps: [
                for (int i = 0; i < _characterSizes.length; i++)
                  Step(
                    title: Text('Step $i'),
                    content: Slider(
                      value: _characterSizes[i],
                      min: 0.5,
                      max: 2.0,
                      onChanged: (value) {
                        setState(() {
                          _characterSizes[i] = value;
                        });
                      },
                    ),
                  ),
              ],
            ),
            SizedBox(height: 16),
            Text(
              'Character Sizes: ${_characterSizes.join(', ')}',
              style: TextStyle(fontSize: 16),
            ),
          ],
        ),
      ),
    );
  }
}

위 코드에서는 _currentStep 변수를 사용해 현재 선택된 단계를 추적하고, _characterSizes 리스트를 사용해 캐릭터 모델의 크기를 저장합니다. Stepper 위젯의 컨트롤 함수인 onStepTapped, onStepContinue, onStepCancel을 사용하여 상호작용하며, Slider 위젯을 사용하여 각 단계에서 크기를 조정할 수 있습니다.

3D 모델링 추가하기

이제 Stepper 위젯을 사용해 3D 모델의 크기를 조정할 수 있도록 구현되었습니다. 이제 실제로 3D 모델을 추가해보겠습니다.

import 'package:vector_math/vector_math.dart' as math;

class _MyHomePageState extends State<MyHomePage> {
  // ...

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('3D Modeling App'),
      ),
      body: Center(
        child: Column(
          children: [
            // Stepper 위젯 코드

            SizedBox(height: 16),

            // 3D 모델
            Container(
              width: 200,
              height: 200,
              child: Transform(
                transform: Matrix4.identity()
                  ..scale(_characterSizes[0]) // 첫 번째 단계의 크기에 따라 변환
                  ..rotateX(math.radians(45)), // 예시로 X축 회전
                child: Placeholder(), // Placeholder 대신 실제 3D 모델 위젯을 사용해주세요.
              ),
            ),
          ],
        ),
      ),
    );
  }
}

위 코드에서는 Transform 위젯을 사용하여 3D 모델의 크기를 조정 및 회전시킬 수 있습니다. 첫 번째 단계에서 _characterSizes[0] 값을 사용하여 크기를 조정하고, rotateX 메서드를 사용하여 X축을 기준으로 회전시킬 수 있습니다. 플레이스홀더(Placeholder)를 실제 3D 모델 위젯으로 변경하여 사용하면 됩니다.

실행 및 결과 확인

프로젝트를 실행하고 애플리케이션을 확인해보세요. Stepper를 사용하여 각 단계에서 캐릭터 모델의 크기를 조정할 수 있고, 3D 모델이 해당 크기와 회전값에 따라 변경되는 것을 확인할 수 있습니다.

마무리

이번 프로젝트에서는 플러터의 Stepper를 이용하여 사용자가 선택한 캐릭터 모델의 크기를 조절하는 3D 모델링 애플리케이션을 만들어보았습니다. Stepper를 사용하여 단계별로 크기를 조정할 수 있으며, 3D 모델을 변환하여 실시간으로 변경된 크기를 시각적으로 확인할 수 있습니다.

더 많은 기능을 추가하거나 원하는 형태의 3D 모델을 사용해보는 등 개선할 수 있는 여지가 있습니다. 이 프로젝트를 기반으로 여러분만의 창조적인 3D 모델링 애플리케이션을 개발해보세요!

참고 자료