0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TypescriptでThree.jsを利用した視力検査の使い方+他

Posted at

使い方

vision_test_process.png
①初期画面です。青色の「START」ボタンを押してください。
②ダイアログの「OK」を押すとボタンが切り替わります。
③上下左右の青色のボタンのいずれかを押して、ランドルト環の切れ目がどの向きにあるのか選んでください。
④最後まで正解したら試験が終了します。ダイアログが出ますので「OK」を押して①に戻ります。

サイトはこちらです。
視力検査

ここからは「他」にあたります

はじめに

超簡単な視力検査を作りました。「使い方がわかりにくいな~」と思ったので、「使い方」を書いてます。

視力検査を作ろうとしたわけ

「私は目が悪いので、簡単に視力検査ができたらな」と思ったのがきっかけです。
「3DCGとwebを組み合わせてみよう」という試みがあります。3Dモデルを使っているのはランドルト環の部分になります。
ランドルト環とは「Cの形をしたマーク」のことです。

使用したもの

ソフト プログラミング言語 ライブラリ プラットフォーム パッケージマネージャ
Maya Typescript Three.js Node.js yarn
Blender - React - -
VScode - Vite - -

苦労したこと

1. ランドルト環の描画サイズの決定

1. 視力検査でよく見る「C」から調べてみる

NIDEKさんのウェブサイトを参考にしました。

NIDEKさんのウェブサイト
ランドルト環とは
視角と視力の関係

ふむふむへーほー(なるほど)。

  • 視力1.0の時、5mの距離から測ったときのランドルト環の大きさは7.272mmとなる。ランドルト環の切れ目の大きさは1.454mmになる。
  • 視角と視力の関係をグラフにすると、視力は隙間の大きさに反比例する。

ということがわかりました。

スマホやiphoneで測る場合で考えると。

画面からの距離 ランドルト環の大きさ ランドルト環の切れ目の大きさ
基本 5m 7.272mm 1.454mm
10で割る 50cm 0.7272mm 0.1454mm
ピクセルへ変換 1889.764px 2.748px 0.549px
使用したピクセル 無視 2.75px 0.55px

となります。
はじめは「画面からの距離」を30cmでやるつもりでしたが、視力1.0の時のランドルト環が、潰れて見えなかったので断念しました。

2. 各視力値の時のランドルト環の大きさを求める

次の動画を参考にしました。

数学校チャンネルさんの動画
ランドルト環と関数について

y=1.5/x を利用して
x : 視力
y : ランドルト環の切り目の大きさ(単位mm)
計px : mmをpxに変換した値
使px : 実際に使用した幅のpx
使px/10 : 実際に使用したpx
ランドルト環 : 使px/10に5を掛けた値

x 0.05 0.07 0.1 0.3 0.5 0.6 0.7 0.8 0.9 1.0
y 30 21.43 15 5 3 2.5 2.14 1.875 1.67 1.5
計px 113 80 56 18.90 11.34 9.45 8.09 7.09 6.31 5.67
使px 112 80 56 19 11 9 8 7 6 5
使px/10 11.2 8 5.6 1.9 1.1 0.9 0.8 0.7 0.6 0.5
ランドルト環 56 40 28 9.5 5.5 4.5 4.0 3.5 3.0 2.5

3. 大体値が一致しているのでヨシ!

1.と2.から、視力1.0の時の値は 2.75px ≒ 2.5px
大体あってます。
実際にウェブアプリケーションの方で視力1.0を表示しているとき、定規で測ってみてください。大体0.7mmになっていると思います。

2. リポジトリの作成ミス

私が知っているリポジトリの作成方法は二つあります。
PowerShell上でリポジトリを作る方法と、github上でリポジトリを作る方法の二つです。
私は両方実行してしまいました。
どういうことかというと、先ず基礎となるフォルダを作成します。次に、git-hub上でリポジトリを作成。その後、PowerShell上でリポジトリを作成していました。するとGit Graphのブランチが二つになってしまいます。

github? Git Graph? ブランチ? リポジトリ?と思った方はこちらを参考にしてください。
github?
Git Graph?
リポジトリ?
ブランチ?

・何が困ったのか?

基礎のフォルダの情報をすべて消してしまったことです。
①基礎のフォルダの情報を持ったブランチ、②何も情報がないブランチとして。①から②へブランチを変更してしまい、手持ちのPCのフォルダ情報がすべて消えてしまいました。

・どう解決したのか?

デフォルトのブランチを変更して、②を削除しました。
幸い、ブランチは残っていたので、リポジトリの設定へ移動。デフォルトブランチを①へ変更した後、②を削除することで解決しました。

3. Material UI Boxのエラー

typescriptで次のようにBoxを使用するとエラーが出ます。
子タグ内

const function_1 = () => {
	//何らかの処理
    return (
        <div>
            <Box xs={{ pt:30 }}>//この行にエラー
    			//略
            </Box>
        </div>
    )
}

export const function_2 = () => {
	//何らかの処理
    return (
        <div>
            <Box xs={{ pt:20 }}>//この行にエラー
    			//略
            </Box>
        </div>
    )
}

export default function_1

親タグ内で

function App() {
  return (
    <div className='任意名'>
      <Function_1 />//頭文字を大文字にしないとエラーが出ます    仕様な模様
      <Function_2 />
    </div>
  )
}

export default App

・エラー内容

子タグで、両方のBox部分に「Expression produces a union type that is too complex to represent. ts(2590)」
翻訳すると「エクスプレッションは、表現するには複雑すぎる共用体型を生成します。」だそうです。
「複雑すぎだよ!」ということですね。

・試したこと

1. 次のウェブページを参考にした処理

私はVscodeを使用してます。
Vscodeでやる処理は、
①ショートカット「Ctrl + Shift + P」を入力
②「TypeScript: Select TypeScript Version...」→「Enter」の順に入力
③「Use workspace version」を選択
エラーの解決はせず。

2. ptの指定方法を変えてみた

二つのパターンで下記のように変更。

const function_1 = () => {
	//何らかの処理
    const TopSpace = { pt:30 }
    return (
        <div>
            <Box xs={TopSpace}>
    			//略
----------------------------------------------
const function_1 = () => {
	//何らかの処理
    return (
        <div>
            <Box pt={30}>
    			//略

エラーの解決はせず。
実際には、function_1はエラーが消えました。しかし、function_2でエラーは残ったままです。

3. Material-UI boxの公式ページをよく見ると…

Overriding MUI components
を発見!
以下のように、function_1とfunction_2のBoxを変更

<Box component="span" pt={3}>
    //略
</Box>

エラーが消えました。
エラーをちゃんと見る。
公式を見る。
この二つが重要ですね。

最後に

github上に公開しています。
利用してみたい方はこちらのgithubページへアクセスしてください。
https://github.com/inxole/Vision_test.git

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?