Compare commits
3 Commits
3203f21a35
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
0d62a793b6
|
|||
|
6d07771f6c
|
|||
|
bc8ece5c63
|
24
.github/workflows/gh-pages.yml
vendored
24
.github/workflows/gh-pages.yml
vendored
@@ -6,6 +6,10 @@ on:
|
||||
- main
|
||||
environment: gh-pages
|
||||
|
||||
env:
|
||||
GITEA_MAIL: ${{ secrets.GITEA_MAIL }}
|
||||
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||
|
||||
jobs:
|
||||
build-deploy:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -14,22 +18,24 @@ jobs:
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 25
|
||||
cache: 'npm'
|
||||
- run: npm i
|
||||
working-directory: atmosphere/
|
||||
- run: |
|
||||
npm i
|
||||
rm -rf dist/vrma
|
||||
git clone https://syu:${GITEA_TOKEN}@git.syui.ai/ai/vrma
|
||||
cp -rf ./vrma/model/ai.vrm public/
|
||||
cp -rf ./vrma/anime/idle.vrma public/
|
||||
working-directory: min-react/
|
||||
|
||||
- name: Build
|
||||
env:
|
||||
TZ: "Asia/Tokyo"
|
||||
VITE_GOOGLE_MAP_API_KEY: ${{ secrets.VITE_GOOGLE_MAP_API_KEY }}
|
||||
run: |
|
||||
cd atmosphere/
|
||||
echo "VITE_GOOGLE_MAP_API_KEY=${{ secrets.VITE_GOOGLE_MAP_API_KEY }}" > .env.production
|
||||
npm run build
|
||||
run: npm run build
|
||||
working-directory: min-react/
|
||||
|
||||
- name: Deploy
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
publish_dir: ./atmosphere/dist
|
||||
publish_dir: ./min-react/dist
|
||||
user_name: 'ai[bot]'
|
||||
user_email: '138105980+yui-syui-ai[bot]@users.noreply.github.com'
|
||||
|
||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1,5 +1,4 @@
|
||||
node_modules
|
||||
*package-lock.json
|
||||
example
|
||||
*yarn.lock
|
||||
**DS_Store
|
||||
@@ -11,3 +10,6 @@ dist
|
||||
three-geospatial
|
||||
**.env
|
||||
.env
|
||||
.env.production
|
||||
**.vrm
|
||||
**.vrma
|
||||
|
||||
@@ -22,6 +22,6 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vitejs/plugin-react": "^4.2.1",
|
||||
"vite": "^5.1.0"
|
||||
"vite": "^7.2.7"
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -27,15 +27,14 @@ import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader';
|
||||
|
||||
const BASE_URL = import.meta.env.BASE_URL;
|
||||
const VRM_URL = `${BASE_URL}ai.vrm`;
|
||||
const VRMA_URL = `${BASE_URL}fly.vrma`;
|
||||
const VRMA_URL = `${BASE_URL}fly_sky.vrma`;
|
||||
const EARTH_RADIUS = 6378137;
|
||||
|
||||
const WEATHER_INTERVAL = 5 * 60 * 1000;
|
||||
|
||||
const TIME_SCALE = 10;
|
||||
const TIME_SCALE = 100;
|
||||
|
||||
// 初期時刻: 正午 (12:00)
|
||||
const INITIAL_DATE = new Date('2024-06-21T16:00:00');
|
||||
const INITIAL_DATE = new Date('2024-06-21T12:00:00');
|
||||
|
||||
// --- Weather Presets (天候設定) ---
|
||||
const WEATHER_PRESETS = [
|
||||
@@ -68,19 +67,17 @@ const WEATHER_PRESETS = [
|
||||
}
|
||||
];
|
||||
|
||||
// --- Locations ---
|
||||
// --- Locations ---
|
||||
const LOCATIONS = [
|
||||
{ name: 'Tokyo', longitude: 139.7671, latitude: 35.6812, heading: 180, pitch: -5, distance: 300 },
|
||||
{ name: 'Fuji', longitude: 138.7278, latitude: 35.3606, heading: 0, pitch: -10, distance: 4000 },
|
||||
{ name: 'Space', longitude: 139.7671, latitude: 35.6812, heading: 0, pitch: -90, distance: 10000000 },
|
||||
{ name: 'Tokyo', longitude: 139.7671, latitude: 35.6812, heading: 180, pitch: -5, distance: 1100 },
|
||||
{ name: 'Fuji', longitude: 138.7278, latitude: 35.3206, heading: 0, pitch: -10, distance: 4000 },
|
||||
{ name: 'Space', longitude: 139.7671, latitude: 35.6812, heading: 0, pitch: -90, distance: 100000 },
|
||||
];
|
||||
|
||||
// --- Shared State for Synchronization ---
|
||||
// 複数のCanvas間で状態を共有するための簡易ストア
|
||||
const worldState = {
|
||||
// 世界座標 (Atmosphere内での位置 - ECEF)
|
||||
position: new Vector3(0, EARTH_RADIUS + 2000, 0),
|
||||
position: new Vector3(0, EARTH_RADIUS + 100000, 0),
|
||||
// ローカル回転 (AvatarLayerでの回転 - Y-up)
|
||||
// Note: This is treated as the "Local" quaternion.
|
||||
quaternion: new Quaternion(),
|
||||
@@ -234,35 +231,55 @@ function AtmosphereScene() {
|
||||
}, []);
|
||||
|
||||
// 3. 時間進行と太陽移動 (Canvas内なのでuseFrameが使える)
|
||||
//useFrame((state, delta) => {
|
||||
// const currentDate = dateRef.current;
|
||||
// const elapsedMs = delta * TIME_SCALE * 1000;
|
||||
// currentDate.setTime(currentDate.getTime() + elapsedMs);
|
||||
// if (atmosphereRef.current) {
|
||||
// atmosphereRef.current.updateByDate(currentDate);
|
||||
// }
|
||||
// if (sunRef.current) {
|
||||
// const hours = currentDate.getHours() + currentDate.getMinutes() / 60 + currentDate.getSeconds() / 3600;
|
||||
// const sunAngle = MathUtils.mapLinear(hours, 6, 18, 0, Math.PI);
|
||||
// const sunX = -Math.cos(sunAngle);
|
||||
// const sunY = Math.sin(sunAngle);
|
||||
|
||||
// if (hours < 6 || hours > 18) {
|
||||
// sunRef.current.position.set(0, -1, 0);
|
||||
// sunRef.current.intensity = 10.0;
|
||||
// } else {
|
||||
// sunRef.current.position.set(sunX, sunY, 0.2);
|
||||
// sunRef.current.intensity = MathUtils.lerp(0.5, 3.0, sunY);
|
||||
// }
|
||||
// }
|
||||
//});
|
||||
useFrame((state, delta) => {
|
||||
const currentDate = dateRef.current;
|
||||
const elapsedMs = delta * TIME_SCALE * 1000;
|
||||
currentDate.setTime(currentDate.getTime() + elapsedMs);
|
||||
|
||||
if (atmosphereRef.current) {
|
||||
atmosphereRef.current.updateByDate(currentDate);
|
||||
}
|
||||
if (sunRef.current) {
|
||||
const hours = currentDate.getHours() + currentDate.getMinutes() / 60 + currentDate.getSeconds() / 3600;
|
||||
const sunAngle = MathUtils.mapLinear(hours, 6, 18, 0, Math.PI);
|
||||
const sunX = -Math.cos(sunAngle);
|
||||
const sunY = Math.sin(sunAngle);
|
||||
|
||||
if (hours < 6 || hours > 18) {
|
||||
sunRef.current.position.set(0, -1, 0);
|
||||
sunRef.current.intensity = 10.0;
|
||||
} else {
|
||||
sunRef.current.position.set(sunX, sunY, 0.2);
|
||||
sunRef.current.intensity = MathUtils.lerp(0.5, 3.0, sunY);
|
||||
const sunDirection = atmosphereRef.current.sunDirection;
|
||||
|
||||
if (sunRef.current && sunDirection) {
|
||||
|
||||
sunRef.current.position.copy(sunDirection);
|
||||
sunRef.current.intensity = 3.0; // 強度は固定で、時間帯による調整はAtmosphereが担当
|
||||
|
||||
if (sunDirection.y < -0.1) {
|
||||
sunRef.current.intensity = 0.1;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* Camera is controlled by FollowCamera component */}
|
||||
<PerspectiveCamera
|
||||
makeDefault
|
||||
near={1}
|
||||
near={10}
|
||||
far={10000000}
|
||||
fov={45}
|
||||
/>
|
||||
@@ -290,7 +307,7 @@ function AtmosphereScene() {
|
||||
/>
|
||||
))}
|
||||
</Clouds>
|
||||
<AerialPerspective sky sunLight skyLight />
|
||||
<AerialPerspective sky />
|
||||
<ToneMapping mode={ToneMappingMode.AGX} />
|
||||
</EffectComposer>
|
||||
</Atmosphere>
|
||||
@@ -332,7 +349,7 @@ function VrmCharacter() {
|
||||
|
||||
// Load all animations
|
||||
const [vrmaFly, vrmaFlyStop, vrmaFlyIdle] = useLoader(GLTFLoader, [
|
||||
`${BASE_URL}fly.vrma`,
|
||||
`${BASE_URL}fly_sky.vrma`,
|
||||
`${BASE_URL}fly_stop.vrma`,
|
||||
`${BASE_URL}fly_idle.vrma`
|
||||
], (loader) => {
|
||||
@@ -552,7 +569,7 @@ function CameraSync() {
|
||||
function AvatarLayer() {
|
||||
return (
|
||||
<Canvas gl={{ alpha: true, antialias: true }}>
|
||||
<PerspectiveCamera makeDefault position={[0, 1.5, 3]} fov={30} />
|
||||
<PerspectiveCamera makeDefault position={[0, 1.5, 3]} fov={40} />
|
||||
<CameraSync />
|
||||
|
||||
<directionalLight position={[-1, 1, 1]} intensity={1.5} />
|
||||
@@ -613,7 +630,7 @@ function LocationUI() {
|
||||
function AtmosphereLayer() {
|
||||
// Canvasが親となり、その中にロジックコンポーネント(AtmosphereScene)を入れる
|
||||
return (
|
||||
<Canvas>
|
||||
<Canvas gl={{ alpha: true, antialias: true }}>
|
||||
<AtmosphereScene />
|
||||
</Canvas>
|
||||
);
|
||||
|
||||
@@ -2,10 +2,7 @@ import { defineConfig } from 'vite'
|
||||
import react from '@vitejs/plugin-react'
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [react()],
|
||||
base: '/',
|
||||
define: {
|
||||
'import.meta.env.VITE_GOOGLE_MAP_API_KEY': JSON.stringify(process.env.VITE_GOOGLE_MAP_API_KEY)
|
||||
}
|
||||
//base: '/pkg/atmosphere/',
|
||||
//base: '/',
|
||||
base: '/pkg/atmosphere/',
|
||||
plugins: [react()]
|
||||
})
|
||||
|
||||
1
min-react/public/CNAME
Normal file
1
min-react/public/CNAME
Normal file
@@ -0,0 +1 @@
|
||||
vrm.syui.ai
|
||||
Binary file not shown.
Binary file not shown.
@@ -19,7 +19,7 @@
|
||||
"@types/three": "^0.167.1",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-scripts": "5.0.1",
|
||||
"react-scripts": "^0.0.0",
|
||||
"three": "^0.167.1",
|
||||
"three-stdlib": "^2.30.5",
|
||||
"typescript": "^4.9.5",
|
||||
|
||||
@@ -27,6 +27,6 @@
|
||||
"globals": "^15.9.0",
|
||||
"typescript": "^5.5.3",
|
||||
"typescript-eslint": "^8.3.0",
|
||||
"vite": "^5.4.2"
|
||||
"vite": "^7.2.7"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user