のぐそんブログ

暗いおじさんがシコシコ書くブログです。

Vueで無料の範囲でFont Awesomeを使う

無料の範囲でFont Awesomeを利用する方法です。 理解に地味に時間がかかったのでメモしておきます。

fontawesome

インストール

$ npm i --save @fortawesome/fontawesome-svg-core
$ npm i --save @fortawesome/free-solid-svg-icons
$ npm i --save @fortawesome/free-brands-svg-icons
$ npm i --save @fortawesome/free-regular-svg-icons
$ npm i --save @fortawesome/vue-fontawesome

Vueの設定

vue-cliで作ったプロジェクトの場合の設定です。 グローバルコンポーネントとして登録する例です。

src/main.js

apple-altを利用する場合です。

import Vue from 'vue'
import App from './App'

/* ここから */
import { library } from '@fortawesome/fontawesome-svg-core'

//apple-alt アイコンをimport
import { faAppleAlt } from '@fortawesome/free-solid-svg-icons'
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'

//利用するアイコンを設定
library.add(faAppleAlt)

Vue.component('font-awesome-icon', FontAwesomeIcon)

/* ここまで */

Vue.config.productionTip = false

new Vue({
  el: '#app',
  components: { App },
  template: '<App/>'
})

コンポーネントで利用する

<template>
  <div id="app">
    <font-awesome-icon icon="user-secret" />
  </div>
</template>

アイコンを全部読み込む

特定のアイコンだけ読み込むのではなく全部読み込む場合です。

import { fas } from '@fortawesome/free-solid-svg-icons'
import { fab } from '@fortawesome/free-brands-svg-icons'
import { far } from '@fortawesome/free-regular-svg-icons'

library.add(fas,fab,far)

solid(fas)以外を利用する

solid以外の、brands、regularを利用する場合は少し書き方が変わるようでした。

<font-awesome-icon :icon="['fab', 'android']" />
<font-awesome-icon :icon="['far', 'address-book']" />

モデリングメモ

辺を選択して面を作成

辺を複数選択後、Command + Fで面を作成することができる。

f:id:nogson2:20191229174856g:plain

選択した頂点を結合

Command + V「 頂点マージ > 最後(最初)に選択した頂点に」で頂点を 結合することができる。

f:id:nogson2:20191229171937g:plain

重複頂点の結合(重複頂点の削除)

重複頂点はCommand + Vもしくはメニューの「頂点 > 距離でマージ」で結合(削除)できます。

f:id:nogson2:20191229165356p:plain

重複頂点の自動マージ

プロパティのコンテクスト>オプションの「自動マージ」で設定できる。 f:id:nogson2:20191229170519p:plain

もしくは、サイドバー(Nで表示される)のツール>オプションから設定できる。 f:id:nogson2:20191229170959p:plain

隣接した面を選択

option(alt)を押しながら、辺を選択すると選択中の面に隣接する面が一括で選択できる。

f:id:nogson2:20191229174401g:plain

バウンディングボックスの位置を変更

Shift + S で表示。

f:id:nogson2:20200101183958p:plain

オブジェクトを複製

Shift + D

プロポーショナル編集

以下の箇所をONにすることでプロポーショナル編集が利用できるようになります。

f:id:nogson2:20200102225244p:plain:w400

f:id:nogson2:20200102225825g:plain

Blender2.8

手順

1. 草束のモデリング

平面を追加

まずは草1本ようのメッシュを作成。
草の束になるので厚みがなくてもきにならないため、平面メッシュで作成する。

  • shift + aメッシュ> 平面で追加。
  • x軸に90度回転する。
  • 編集モード(tab)でメッシュを縦に細長くする。

f:id:nogson2:20200104111500p:plain:w300

平面を曲げて草の形状を作成

まずは、平面をCtrl + rで分割する。
分割数は適当。

f:id:nogson2:20200104112220p:plain:w300

草の先を作る為に一番上のポリゴンの頂点を削除して三角形にする。 f:id:nogson2:20200104112220p:plain:w300

次に草のように形を整える。
プロポーショナル編集モードを利用すると簡単。

f:id:nogson2:20200104113841p:plain:w300

草を複製

作成した草をShift + Dでコピーします。
その際に、ピポットポイントを草の根本に設定すると、ピポットポイントを原点に回転縮小ができるので便利です。
ここでは3Dカーソルの位置をピポットポイントにします。 f:id:nogson2:20200104120709p:plain:w300

複製して、回転と縮小で調整していくとこんな感じになります。

f:id:nogson2:20200104120900p:plain:w300

2. 地面の設置

地面のベースを作成する

平面メッシュを作成して、コンテクストメニューから「細分化」を何回か実行する。 f:id:nogson2:20200104123438p:plain:w300

コンテクストメニューから「頂点をランダム化」を実行し頂点の位置をランダムに配置する。

f:id:nogson2:20200104123753p:plain:w300

コンテクストメニューから「頂点をスムーズに」を実行し頂点をスムーズにする。

f:id:nogson2:20200104124355p:plain:w300

さらにオブジェクトモードに切り替えて「オブジェクト > スムーズシェード」を実行します。
編集モードのスムーズは頂点情報を変更していますが、オブジェクトモードのスムーズは見た目だけを変更して頂点情報は変更していません。

f:id:nogson2:20200104124722p:plain:w300

3. パーティクルの設定

地面に草を生やす為ににパーティクル設定をしていきます。
まずは、以下の手順でパーティクルを追加します。 f:id:nogson2:20200104125309p:plain:w500

前手順で作成した草のオブジェクトをコレクションに設定します。
次に、「レンダリング方法 > コレクション」を設定し、「コレクション > 草のコレクション」を選択します。

f:id:nogson2:20200104125759p:plain:w500

草の生え具合を調整していくのですが、一旦草の数を0にします。 f:id:nogson2:20200104134004p:plain:w300

次にパーティクル編集モードに切り替えます。

f:id:nogson2:20200104133348p:plain:w500

草の生やすのはメニューの「追加」を選択して生やしたい箇所をドラックします。   プロパティの「ツール」を選択して、半径、数で生やす本数を調整します。

f:id:nogson2:20200104133759p:plain:w300

あとは地面にテクスチャを設定して終わりです。

f:id:nogson2:20200104143434p:plain:w300

Vueとvue-i18nとstorybookでCannot read property &#39;_t&#39; of undefined

vue-i18nを利用して多言語化しているコンポーネントを、storybookに登録した際に以下のエラーが発生しました。

Cannot read property '_t' of undefined

こちらの記事を参考に、修正しました。

config.jsに以下を追加します。

import { addDecorator } from '@storybook/vue'
import i18n from '@/i18n'

addDecorator(() => ({
  template: '<story/>',
  i18n
}))

こちらで解消しました。