トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

Reactですりガラス、ジョイスティック、R3FでVRM表示などなど

前回WebAR/VRと2DUIを置くのをやった

bibinbaleo.hatenablog.com

今回はVRM置いたり、ジョイスティック移動してみたりする。

VRM

pixivが出しているpixiv/three-vrmを使うらしい

github.com

基本的にこちらの記事通りにやった。

synamon.hatenablog.com

一点、import { GLTFLoader, GLTF } from "three/examples/jsm/loaders/GLTFLoader"の部分がないといわれるが、ちゃんとthreeは入れている。

import { GLTFLoader, GLTF } from "three/examples/jsm/loaders/GLTFLoader.js"

と最後に.jsを付けたら治ると教えてもらって治った!

あとは同じ!

<gridHelper />でグリッドが出て、

          <OrbitControls
            enableZoom={true}
            enablePan={true}
            enableDamping={false}
          />

で拡大縮小や回転などの操作ができるようになった!

位置を変更するには

tmpGltf.scene.position.set(-1, 0, -1);

Drei

キューブとかテキストとかを出せるDrei。思いのほか出せるものにいろいろ種類があった

github.com

前回出したHTMLのテキストと普通のTextの違いは、HTMLのほうのテキストは選択できるし、LookAtされるし常に手前に出る

あと、スマホやPCで見たときは分からなかったが、QuestのVRで見たらHTMLのほうは空間になくブラウザの画面にくっついてた。

アバターのネームプレートに使おうかと思ったが、VRでそうなるなら使えなさそう・・・

ジョイスティック

これを使うとよさそう。r3f関係なかった。

github.com

できた。

            <Joystick
              size={props.size || 84}
              stickSize={props.size || 50}
              sticky={props.sticky || false}
              baseColor={props.baseColor || "rgba(0, 0, 0, 0.4)"}
              stickColor={props.stickColor || "#FFFBF6"}
              move={handleMove}
              stop={handleStop}
            ></Joystick>

デザインもいろいろ変更できる

すりガラスエフェクト

これもr3fと全く関係ないがすりガラスエフェクトめっちゃ簡単にできてむかつく(Unity民の嫉妬)

          backgroundColor: "rgba(255, 255, 255, 0.25)",
          backdropFilter: "blur(10px)",
          borderRadius: "100px",
          //boxShadow: "0 4px 30px rgba(0, 0, 0, 0.1)",
          textAlign: "center",

qiita.com

ジョイスティックもガラスエフェクトにできた。iOS標準のジョイスティックっぽい

          <div style={{ backdropFilter: "blur(10px)", borderRadius: "100px" }}>
            <Joystick
              size={props.size || 84}
              stickSize={props.size || 50}
              sticky={props.sticky || false}
              baseColor={props.baseColor || "rgba(0, 0, 0, 0.4)"}
              stickColor={props.stickColor || "#FFFBF6"}
              move={handleMove}
              stop={handleStop}
            ></Joystick>
          </div>

ビルドしてスマホで動かしたら、iOSではすりガラスにならなかった。

              WebkitBackdropFilter: "blur(3px)",
              backdropFilter: "blur(3px)",

のようにWebkitを付けた版も書くといいらしい。

pengi-n.co.jp

モバイル判定

ARはPCでは表示する必要がないので、モバイル判定してボタンのだし分けをしてみる

これ使うといいのかな?

www.npmjs.com

scrawledtechblog.com

ほかにもいろいろあるっぽいが何がメジャーなのだろう

suwaru.tokyo

とりあえずreact-device-detectを使った。

こんな感じで使えた。

import { isMobile } from "react-device-detect";

      {isMobile && (
        <ARButton
          style={{
            position: "fixed",
            right: 80,
            bottom: 45,
            backgroundColor: "white",
            color: "black",
            padding: 10,
            borderRadius: 30,
          }}
        ></ARButton>
      )}

QuestはPC判定だった。QuestはARもVRもできるので別途判定が必要そう。調べたけどよくわからない。そもそもWebVRやWebARに対応しているかで判定したほうがいいのかも?

gaprot.jp

ライセンス表記

JoystickのプラグインはMITライセンスだった。ほかにもライセンス表記いるのでは。

package.jsonに載っているものを軽く調べたら、やはりMITライセンスが多い。

かなりパッケージ多いのでツール使ってみる。

qiita.com

上の記事で紹介されていたものを使ったが500件ぐらい出てきて使い物にならない├─ MIT: 489
├─ ISC: 36
├─ Apache-2.0: 17
├─ BSD-2-Clause: 9
├─ BSD-3-Clause: 7
├─ BlueOak-1.0.0: 2
├─ 0BSD: 2
├─ Python-2.0: 1
├─ MPL-2.0: 1
├─ CC-BY-4.0: 1
├─ CC0-1.0: 1
├─ UNLICENSED: 1
├─ (MIT OR CC0-1.0): 1
└─ MIT*: 1

Githubのライセンス文をコピペして貼り付けるには<pre>というタグを使うといいらしい

S3アップロード

WebARなどはhttpsの環境でないと試せない。

S3にアップする

nururuv-blog.com

npm run buildで静的サイト用のアウトプットフォルダができる。

だがエラーが出た

Type error: Type 'OmitWithTag<typeof import

reactjs - Next.js TypeScript Build Error: Type 'OmitWithTag<InputFormProps, keyof PageProps, "default">' Issue - Stack Overflow

 

page.tsxでexportを2重に行っていたせいらしいです。

末尾に

export default XXX;

とつけているのに、上のほうでもexportしていたので、これを消す

あとは記事通りにできた。

S3の静的ウェブサイトホスティングのURLからだとhttpsになっていないので、index.htmlのオブジェクトのURLからたどる。

ただしそのURLだと各ページに直接URLをたたくと怒られる・・・

404ページ

デザインされた404ページがデフォルトで用意されていた。

 

どこに元があるのだろうか?

よくわからないがオリジナルデザインにする場合は、用意されているものをいじるのではなく自分でnot-found.tsxファイルを作るみたいだ。

zenn.dev

できた

ファビコン

ファビコンも変えたい。appの中にあったファビコン画像を置き換えても変わらなかった・・・

この方法簡単そう

qiita.com

import { Head } from "next/document";
<Head>
  <link rel="icon" href="/favicon.png" />
</Head>;

これだとnpm run buildでエラーが出た;;

こちらの方法でうまくできた!appフォルダの中にicon.icoを置く。

qiita.com

いろいろなプラットフォームで対応させるのは以下の記事がよさそう

qiita.com

画像挿入

この時うまくいかなかったAntDesignのボタンにこちらが用意したsvgのアイコンを置くのもできた。

bibinbaleo.hatenablog.com

基本この通り

qiita.com

next.config.mjsにimages: {unoptimized: true,を追加

/** @type {import('next').NextConfig} */
const nextConfig = {
  output: "export",
  trailingSlash: true,
  images: {
    unoptimized: true,
  },
};

export default nextConfig;

 

ボタンがデフォルトだと右にずれたのでこうした。画像はpublicに置く。

          <FloatButton
            icon={
              <div
                style={{
                  display: "flex",
                  justifyContent: "center",
                  alignItems: "center",
                }}
              >
                <Image
                  src="/view_in_ar.svg"
                  width={24}
                  height={24}
                  alt="view_in_ar"
                />
              </div>
            }