Skip to content

Instantly share code, notes, and snippets.

View dosterz97's full-sized avatar

Zachary Kyle Doster dosterz97

View GitHub Profile
@dosterz97
dosterz97 / AvatarView.js
Created May 3, 2022 14:50
Initialize the Predictor
import { AUPredictor } from '@quarkworks-inc/avatar-webkit'
export class AvatarView extends React.Component {
...
predictor = new AUPredictor({
apiToken: '...', // Your auth token
shouldMirrorOutput: true
})
@dosterz97
dosterz97 / AvatarView.js
Created May 3, 2022 14:48
Receiving the blend shapes
async componentDidMount() {
...
this.predictor.onPredict = this.onPredict.bind(this)
}
onPredict = (results) => {
const head = this.avatar.children.find((child) => child.name === "Wolf3D_Avatar")
Object.entries(results.actionUnits).forEach(function([key, value]) {
const index = head.morphTargetDictionary[key] head.morphTargetInfluences[index] = value
})
}
@dosterz97
dosterz97 / AvatarView.js
Created May 3, 2022 14:47
Starting and Stopping the predictor
async componentDidUpdate(oldProps) {
...
if(this.props?.predicting !== oldProps?.predicting) {
if(this.props?.predicting && this.predictor.state === 'stopped') {
let stream = await navigator.mediaDevices.getUserMedia({
audio: false,
video: {
width: { ideal: 640 },
height: { ideal: 360 },
facingMode: 'user'
@dosterz97
dosterz97 / App.js
Created May 3, 2022 14:47
Pass state variables
function App() {
...
const [predicting, setPredicting] = useState(false)
...
return (
...
{avatarUrl &&
<input
className="toggleButton"
onClick={() => setPredicting(!predicting)}
@dosterz97
dosterz97 / AvatarView.js
Created May 3, 2022 14:46
Adding translation and rotation
onPredict = (results) => {
...
const {
pitch,
yaw,
roll,
} = results.rotation
this.avatar?.rotation.set(-pitch, yaw, roll)
const {
x,
@dosterz97
dosterz97 / App.js
Created April 25, 2022 14:10
Add avatar view to app.js
import { AvatarView } from './AvatarView';return (
...
{avatarUrl && <AvatarView avatarUrl={avatarUrl} showIFrame={showIFrame}/>}
...
)
@dosterz97
dosterz97 / AvatarView.js
Last active June 27, 2022 21:05
hide Iframe
async componentDidUpdate(oldProps) {
if(this.props?.avatarUrl && this.props?.avatarUrl !== oldProps?.avatarUrl) {
this.loadModel()
}
this.renderer.domElement.style.cssText = `display: ${!this.props.showIFrame ? 'block': 'none'}`
}
@dosterz97
dosterz97 / AvatarView.js
Last active June 27, 2022 20:28
Load Model
async componentDidMount() {
...
this.loadModel()
...
}
@dosterz97
dosterz97 / AvatarView.js
Last active June 27, 2022 20:24
loadGLTF
loadGLTF(url) {
return new Promise((resolve) => {
const loader = new GLTFLoader()
loader.load(url, (gltf) => resolve(gltf))
})
}
@dosterz97
dosterz97 / AvatarView.js
Last active June 27, 2022 20:24
Load Model
async loadModel() {
const gltf = await this.loadGLTF(this.props.avatarUrl)
this.avatar = gltf.scene.children[0]
this.avatar.position.set(0, -4, 0)
this.avatar.scale.setScalar(7.5) this.scene.add(this.avatar)
}