{"id":29,"date":"2026-06-26T00:58:19","date_gmt":"2026-06-26T00:58:19","guid":{"rendered":"https:\/\/freebirds3d.com\/?page_id=29"},"modified":"2026-06-26T01:00:22","modified_gmt":"2026-06-26T01:00:22","slug":"pose","status":"publish","type":"page","link":"https:\/\/freebirds3d.com\/?page_id=29","title":{"rendered":"pose"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"29\" class=\"elementor elementor-29\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c70a6f6 e-flex e-con-boxed e-con e-parent\" data-id=\"c70a6f6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-65399b0 elementor-widget elementor-widget-html\" data-id=\"65399b0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<meta charset=\"utf-8\">\n<title>Bucket Baby GLB Poser - v3 Media Library<\/title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<style>\n  html, body { margin:0; height:100%; overflow:hidden; background:#202020; color:#eee; font-family:Arial, sans-serif; }\n  #ui { position:absolute; left:0; top:0; bottom:0; width:350px; background:#080808; padding:12px; overflow:auto; box-sizing:border-box; z-index:5; }\n  #viewer { position:absolute; left:350px; top:0; right:0; bottom:0; }\n  h2 { margin:0 0 10px 0; font-size:18px; }\n  h3 { margin:14px 0 6px; font-size:14px; border-top:1px solid #333; padding-top:10px; }\n  button, input[type=file], select { width:100%; margin:4px 0; box-sizing:border-box; }\n  button { padding:5px; }\n  label { display:block; font-size:12px; margin-top:7px; }\n  input[type=range] { width:100%; }\n  input[type=number] { width:100%; box-sizing:border-box; }\n  .bonebox { background:#151515; border:1px solid #333; padding:7px; margin:7px 0; }\n  .bonename { font-weight:bold; font-size:12px; margin-bottom:4px; color:#fff; }\n  .axisrow { display:grid; grid-template-columns:18px 1fr 46px; align-items:center; gap:5px; font-size:11px; }\n  .small { font-size:11px; color:#bbb; line-height:1.35; }\n  #status { font-size:11px; color:#bbb; margin-top:6px; white-space:pre-wrap; }\n  details { border:1px solid #333; background:#111; margin:8px 0; padding:4px; }\n  summary { cursor:pointer; font-weight:bold; font-size:13px; padding:4px; }\n  .fileLabel { font-size:12px; color:#bbb; margin-top:6px; }\n<\/style>\n<\/head>\n<body>\n<div id=\"ui\">\n  <h2>Bucket Baby GLB Poser v3<\/h2>\n\n  <h3>Load Model<\/h3>\n  <div class=\"fileLabel\">Load from your computer<\/div>\n  <input id=\"file\" type=\"file\" accept=\".glb,.gltf\">\n\n  <div class=\"fileLabel\">Load from WordPress Media Library<\/div>\n  <select id=\"mediaModelSelect\">\n    <option value=\"\">Select a media model...<\/option>\n    <option value=\"https:\/\/winterhavenhydroponics.com\/wp-content\/uploads\/2026\/06\/Fat_Toad.glb\">Fat Toad<\/option>\n    <option value=\"https:\/\/winterhavenhydroponics.com\/wp-content\/uploads\/2026\/06\/Horned_Toad.glb\">Horned Toad<\/option>\n  <\/select>\n  <button id=\"mediaLoadBtn\">Load Media Library Model<\/button>\n\n  <button id=\"fitBtn\">Fit \/ Center Model<\/button>\n  <button id=\"groundBtn\">Put Model On Ground<\/button>\n  <button id=\"resetBtn\">Reset Pose + Sliders<\/button>\n  <button id=\"exportBtn\">Export Posed STL<\/button>\n\n  <h3>Model Zoom \/ Size<\/h3>\n  <input id=\"scaleSlider\" type=\"range\" min=\"0.05\" max=\"5\" step=\"0.01\" value=\"1\">\n\n  <h3>STL Export<\/h3>\n  <label>Export Scale Multiplier<\/label>\n  <input id=\"exportScale\" type=\"number\" min=\"0.001\" step=\"1\" value=\"10\">\n  <div class=\"small\">Default scale 10 works well for most Bucket Baby models. If the STL is tiny, increase this number. If it is huge, reduce it.<\/div>\n\n  <label>STL Format<\/label>\n  <select id=\"stlFormat\">\n    <option value=\"binary\" selected>Binary STL - smaller, better<\/option>\n    <option value=\"ascii\">ASCII STL - bigger, readable text<\/option>\n  <\/select>\n\n  <h3>Bone Slider Options<\/h3>\n  <label>Max Rotation Degrees<\/label>\n  <input id=\"maxRot\" type=\"range\" min=\"5\" max=\"90\" step=\"1\" value=\"45\">\n  <div class=\"small\">Current max: <span id=\"maxRotLabel\">45<\/span>\u00b0<\/div>\n\n  <label><input id=\"onlyUseful\" type=\"checkbox\" checked> Hide helper\/unnamed bones<\/label>\n  <button id=\"zeroBtn\">Zero All Slider Values<\/button>\n\n  <h3>Named Bone Controls<\/h3>\n  <div class=\"small\">\n    Sliders are grouped automatically by bone names. Reset Pose + Sliders returns the creature to the imported pose. Zero All Slider Values sets all bone offsets to 0\u00b0.\n  <\/div>\n  <div id=\"boneControls\"><\/div>\n\n  <h3>Status<\/h3>\n  <div id=\"status\">Load a rigged GLB.<\/div>\n<\/div>\n\n<div id=\"viewer\"><\/div>\n\n<script type=\"importmap\">\n{\n  \"imports\": {\n    \"three\": \"https:\/\/unpkg.com\/three@0.160.0\/build\/three.module.js\",\n    \"three\/addons\/\": \"https:\/\/unpkg.com\/three@0.160.0\/examples\/jsm\/\"\n  }\n}\n<\/script>\n\n<script type=\"module\">\nimport * as THREE from 'three';\nimport { OrbitControls } from 'three\/addons\/controls\/OrbitControls.js';\nimport { GLTFLoader } from 'three\/addons\/loaders\/GLTFLoader.js';\nimport { STLExporter } from 'three\/addons\/exporters\/STLExporter.js';\n\nconst viewer = document.getElementById('viewer');\nconst statusEl = document.getElementById('status');\nconst boneControls = document.getElementById('boneControls');\n\nlet scene, camera, renderer, controls;\nlet root = null;\nlet model = null;\nlet skinnedMeshes = [];\nlet bones = [];\nlet bindPose = new Map();\nlet poseAngles = new Map();\n\ninit();\n\nfunction log(msg) { statusEl.textContent = msg; }\n\nfunction init() {\n  scene = new THREE.Scene();\n  scene.background = new THREE.Color(0x202020);\n\n  camera = new THREE.PerspectiveCamera(45, viewer.clientWidth \/ viewer.clientHeight, 0.01, 100000);\n  camera.position.set(2.5, 2, 3.5);\n\n  renderer = new THREE.WebGLRenderer({ antialias:true });\n  renderer.setPixelRatio(window.devicePixelRatio);\n  renderer.setSize(viewer.clientWidth, viewer.clientHeight);\n  viewer.appendChild(renderer.domElement);\n\n  controls = new OrbitControls(camera, renderer.domElement);\n  controls.enableDamping = true;\n\n  scene.add(new THREE.HemisphereLight(0xffffff, 0x444444, 2.0));\n  const dir = new THREE.DirectionalLight(0xffffff, 2.5);\n  dir.position.set(5, 8, 4);\n  scene.add(dir);\n\n  const grid = new THREE.GridHelper(10, 40, 0x777777, 0x555555);\n  grid.name = 'groundGrid';\n  scene.add(grid);\n\n  window.addEventListener('resize', onResize);\n  animate();\n}\n\nfunction onResize() {\n  camera.aspect = viewer.clientWidth \/ viewer.clientHeight;\n  camera.updateProjectionMatrix();\n  renderer.setSize(viewer.clientWidth, viewer.clientHeight);\n}\n\nfunction animate() {\n  requestAnimationFrame(animate);\n  controls.update();\n  renderer.render(scene, camera);\n}\n\nfunction loadModelFromUrl(url, displayName, revokeWhenDone) {\n  const loader = new GLTFLoader();\n\n  loader.load(url, (gltf) => {\n    if (root) scene.remove(root);\n\n    root = new THREE.Group();\n    model = gltf.scene;\n    root.add(model);\n    scene.add(root);\n\n    skinnedMeshes = [];\n    bones = [];\n    bindPose.clear();\n    poseAngles.clear();\n\n    model.traverse(obj => {\n      if (obj.isSkinnedMesh) {\n        skinnedMeshes.push(obj);\n        obj.frustumCulled = false;\n      }\n      if (obj.isBone) {\n        bones.push(obj);\n        bindPose.set(obj.uuid, {\n          position: obj.position.clone(),\n          quaternion: obj.quaternion.clone(),\n          scale: obj.scale.clone()\n        });\n        poseAngles.set(obj.uuid, { x:0, y:0, z:0 });\n      }\n    });\n\n    document.getElementById('scaleSlider').value = root.scale.x;\n    buildBoneSliders();\n    fitModel();\n    putOnGround();\n\n    log(`Loaded: ${displayName}\\nBones found: ${bones.length}\\nSkinned meshes: ${skinnedMeshes.length}`);\n\n    if (revokeWhenDone) URL.revokeObjectURL(url);\n  }, undefined, (err) => {\n    console.error(err);\n    log(`Could not load: ${displayName}\\nURL: ${url}\\nOpen F12 Console for details.`);\n    if (revokeWhenDone) URL.revokeObjectURL(url);\n  });\n}\n\ndocument.getElementById('file').addEventListener('change', (e) => {\n  const file = e.target.files[0];\n  if (!file) return;\n\n  const url = URL.createObjectURL(file);\n  loadModelFromUrl(url, file.name, true);\n});\n\ndocument.getElementById('mediaLoadBtn').addEventListener('click', () => {\n  const select = document.getElementById('mediaModelSelect');\n  const url = select.value;\n\n  if (!url) {\n    log('Choose a Media Library model first.');\n    return;\n  }\n\n  const displayName = select.options[select.selectedIndex].textContent;\n  log(`Trying Media Library model:\\n${url}`);\n  loadModelFromUrl(url, displayName, false);\n});\n\ndocument.getElementById('fitBtn').onclick = fitModel;\ndocument.getElementById('groundBtn').onclick = putOnGround;\ndocument.getElementById('resetBtn').onclick = resetPose;\ndocument.getElementById('exportBtn').onclick = exportPosedSTL;\ndocument.getElementById('zeroBtn').onclick = zeroAllSliders;\n\ndocument.getElementById('scaleSlider').addEventListener('input', e => {\n  if (!root) return;\n  const s = parseFloat(e.target.value);\n  root.scale.setScalar(s);\n  putOnGround();\n});\n\ndocument.getElementById('maxRot').addEventListener('input', e => {\n  document.getElementById('maxRotLabel').textContent = e.target.value;\n  buildBoneSliders();\n});\n\nfunction usefulBoneName(name) {\n  if (!name || name.trim() === '') return false;\n  const n = name.toLowerCase();\n  if (n.includes('armature')) return false;\n  if (n.includes('root')) return false;\n  if (n.includes('ik')) return false;\n  if (n.includes('target')) return false;\n  if (n.includes('pole')) return false;\n  if (n.includes('ctrl')) return false;\n  return true;\n}\n\nfunction groupNameForBone(name) {\n  const n = (name || '').toLowerCase();\n\n  if (n.includes('head') || n.includes('eye') || n.includes('jaw')) return 'Head';\n  if (n.includes('neck')) return 'Neck';\n  if (n.includes('back') || n.includes('spine') || n.includes('body') || n.includes('chest') || n.includes('hips')) return 'Body \/ Back';\n  if (n.includes('tail')) return 'Tail';\n\n  if (n.includes('front') && n.includes('left')) return 'Front Left Leg';\n  if (n.includes('front') && n.includes('right')) return 'Front Right Leg';\n  if (n.includes('rear') && n.includes('left')) return 'Rear Left Leg';\n  if (n.includes('rear') && n.includes('right')) return 'Rear Right Leg';\n\n  if (n.includes('left')) return 'Left Side';\n  if (n.includes('right')) return 'Right Side';\n\n  return 'Other Bones';\n}\n\nfunction applyPoseAngles(bone) {\n  const bind = bindPose.get(bone.uuid);\n  const a = poseAngles.get(bone.uuid);\n  if (!bind || !a) return;\n\n  const qx = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1,0,0), THREE.MathUtils.degToRad(a.x));\n  const qy = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0,1,0), THREE.MathUtils.degToRad(a.y));\n  const qz = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0,0,1), THREE.MathUtils.degToRad(a.z));\n\n  bone.position.copy(bind.position);\n  bone.scale.copy(bind.scale);\n  bone.quaternion.copy(bind.quaternion);\n  bone.quaternion.multiply(qx).multiply(qy).multiply(qz);\n  bone.updateMatrixWorld(true);\n}\n\nfunction buildBoneSliders() {\n  boneControls.innerHTML = '';\n  const maxDeg = parseFloat(document.getElementById('maxRot').value);\n  const onlyUseful = document.getElementById('onlyUseful').checked;\n  const shownBones = bones.filter(b => !onlyUseful || usefulBoneName(b.name));\n\n  if (!shownBones.length) {\n    boneControls.textContent = root ? 'No displayable bones found.' : 'Load a GLB first.';\n    return;\n  }\n\n  const groupOrder = [\n    'Head', 'Neck', 'Body \/ Back', 'Tail',\n    'Front Left Leg', 'Front Right Leg', 'Rear Left Leg', 'Rear Right Leg',\n    'Left Side', 'Right Side', 'Other Bones'\n  ];\n\n  const groups = new Map();\n  groupOrder.forEach(g => groups.set(g, []));\n  shownBones.forEach(b => groups.get(groupNameForBone(b.name)).push(b));\n\n  groupOrder.forEach(groupName => {\n    const groupBones = groups.get(groupName);\n    if (!groupBones || !groupBones.length) return;\n\n    const details = document.createElement('details');\n    details.open = ['Head', 'Neck', 'Body \/ Back', 'Tail'].includes(groupName);\n\n    const summary = document.createElement('summary');\n    summary.textContent = `${groupName} (${groupBones.length})`;\n    details.appendChild(summary);\n\n    groupBones.forEach(bone => {\n      const box = document.createElement('div');\n      box.className = 'bonebox';\n\n      const title = document.createElement('div');\n      title.className = 'bonename';\n      title.textContent = bone.name || '(unnamed bone)';\n      box.appendChild(title);\n\n      const angles = poseAngles.get(bone.uuid) || {x:0,y:0,z:0};\n\n      ['x','y','z'].forEach(axis => {\n        const row = document.createElement('div');\n        row.className = 'axisrow';\n\n        const lab = document.createElement('div');\n        lab.textContent = axis.toUpperCase();\n\n        const slider = document.createElement('input');\n        slider.type = 'range';\n        slider.min = -maxDeg;\n        slider.max = maxDeg;\n        slider.step = 1;\n        slider.value = Math.max(-maxDeg, Math.min(maxDeg, angles[axis]));\n\n        const val = document.createElement('div');\n        val.textContent = slider.value + '\u00b0';\n\n        slider.addEventListener('input', () => {\n          const deg = parseFloat(slider.value);\n          poseAngles.get(bone.uuid)[axis] = deg;\n          val.textContent = deg.toFixed(0) + '\u00b0';\n          applyPoseAngles(bone);\n        });\n\n        row.appendChild(lab);\n        row.appendChild(slider);\n        row.appendChild(val);\n        box.appendChild(row);\n      });\n\n      details.appendChild(box);\n    });\n\n    boneControls.appendChild(details);\n  });\n}\n\nfunction zeroAllSliders() {\n  bones.forEach(bone => {\n    poseAngles.set(bone.uuid, { x:0, y:0, z:0 });\n    applyPoseAngles(bone);\n  });\n  buildBoneSliders();\n  log('All slider values set to 0\u00b0. Creature returned to imported bone rotations.');\n}\n\nfunction resetPose() {\n  bones.forEach(bone => {\n    const p = bindPose.get(bone.uuid);\n    if (!p) return;\n    bone.position.copy(p.position);\n    bone.quaternion.copy(p.quaternion);\n    bone.scale.copy(p.scale);\n    poseAngles.set(bone.uuid, { x:0, y:0, z:0 });\n    bone.updateMatrixWorld(true);\n  });\n  buildBoneSliders();\n  log('Pose and sliders reset to imported bind pose.');\n}\n\nfunction getBox() {\n  if (!root) return null;\n  root.updateMatrixWorld(true);\n  return new THREE.Box3().setFromObject(root);\n}\n\nfunction fitModel() {\n  if (!root) return;\n  const box = getBox();\n  if (!box || box.isEmpty()) return;\n\n  const size = new THREE.Vector3();\n  const center = new THREE.Vector3();\n  box.getSize(size);\n  box.getCenter(center);\n\n  controls.target.copy(center);\n  const maxDim = Math.max(size.x, size.y, size.z);\n  const dist = maxDim * 2.0 \/ Math.tan(THREE.MathUtils.degToRad(camera.fov * 0.5));\n  camera.position.set(center.x + dist * 0.45, center.y + dist * 0.35, center.z + dist * 0.65);\n  camera.near = Math.max(maxDim \/ 1000, 0.001);\n  camera.far = maxDim * 1000;\n  camera.updateProjectionMatrix();\n  controls.update();\n}\n\nfunction putOnGround() {\n  if (!root) return;\n  root.updateMatrixWorld(true);\n  const box = getBox();\n  if (!box || box.isEmpty()) return;\n  root.position.y -= box.min.y;\n  root.updateMatrixWorld(true);\n}\n\nfunction applyBoneTransformToVertex(mesh, index, target) {\n  const geom = mesh.geometry;\n  const pos = geom.attributes.position;\n  const skinIndex = geom.attributes.skinIndex;\n  const skinWeight = geom.attributes.skinWeight;\n\n  target.fromBufferAttribute(pos, index).applyMatrix4(mesh.bindMatrix);\n\n  const result = new THREE.Vector3(0,0,0);\n  const temp = new THREE.Vector3();\n  const si = new THREE.Vector4().fromBufferAttribute(skinIndex, index);\n  const sw = new THREE.Vector4().fromBufferAttribute(skinWeight, index);\n\n  const skeleton = mesh.skeleton;\n  skeleton.update();\n\n  for (let j = 0; j < 4; j++) {\n    const weight = sw.getComponent(j);\n    if (weight === 0) continue;\n\n    const boneIndex = si.getComponent(j);\n    const boneMatrix = new THREE.Matrix4().fromArray(skeleton.boneMatrices, boneIndex * 16);\n\n    temp.copy(target).applyMatrix4(boneMatrix);\n    result.addScaledVector(temp, weight);\n  }\n\n  result.applyMatrix4(mesh.bindMatrixInverse);\n  result.applyMatrix4(mesh.matrixWorld);\n  return result;\n}\n\nfunction bakedGeometryFromSkinnedMesh(mesh, exportScale) {\n  mesh.skeleton.update();\n  mesh.updateMatrixWorld(true);\n\n  const src = mesh.geometry;\n  const pos = src.attributes.position;\n  const baked = new THREE.BufferGeometry();\n\n  const bakedPositions = new Float32Array(pos.count * 3);\n  const v = new THREE.Vector3();\n\n  for (let i = 0; i < pos.count; i++) {\n    const out = applyBoneTransformToVertex(mesh, i, v).multiplyScalar(exportScale);\n    bakedPositions[i*3+0] = out.x;\n    bakedPositions[i*3+1] = out.y;\n    bakedPositions[i*3+2] = out.z;\n  }\n\n  baked.setAttribute('position', new THREE.BufferAttribute(bakedPositions, 3));\n\n  if (src.index) baked.setIndex(src.index.clone());\n  baked.computeVertexNormals();\n  return baked;\n}\n\nfunction exportPosedSTL() {\n  if (!root || !skinnedMeshes.length) {\n    log('No skinned mesh found. Load a rigged GLB first.');\n    return;\n  }\n\n  root.updateMatrixWorld(true);\n\n  const exportScale = parseFloat(document.getElementById('exportScale').value) || 1;\n  const binary = document.getElementById('stlFormat').value === 'binary';\n\n  const exportGroup = new THREE.Group();\n\n  skinnedMeshes.forEach((mesh, i) => {\n    const bakedGeom = bakedGeometryFromSkinnedMesh(mesh, exportScale);\n    const m = new THREE.Mesh(bakedGeom, new THREE.MeshStandardMaterial());\n    m.name = mesh.name || `posed_mesh_${i}`;\n    exportGroup.add(m);\n  });\n\n  const exporter = new STLExporter();\n  const stlData = exporter.parse(exportGroup, { binary });\n\n  const blob = new Blob([stlData], { type: binary ? 'application\/octet-stream' : 'model\/stl' });\n  const a = document.createElement('a');\n  a.href = URL.createObjectURL(blob);\n  a.download = 'bucket_baby_posed.stl';\n  document.body.appendChild(a);\n  a.click();\n  a.remove();\n\n  setTimeout(() => URL.revokeObjectURL(a.href), 1000);\n\n  log(`Exported posed ${binary ? 'binary' : 'ASCII'} STL.\\nExport scale: ${exportScale}\\nIf tiny in slicer, increase export scale. If too big, reduce it.`);\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Bucket Baby GLB Poser &#8211; v3 Media Library Bucket Baby GLB Poser v3 Load Model Load from your computer Load [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-29","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>pose - freebirds3d<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/freebirds3d.com\/?page_id=29\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"pose - freebirds3d\" \/>\n<meta property=\"og:description\" content=\"Bucket Baby GLB Poser &#8211; v3 Media Library Bucket Baby GLB Poser v3 Load Model Load from your computer Load [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/freebirds3d.com\/?page_id=29\" \/>\n<meta property=\"og:site_name\" content=\"freebirds3d\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-26T01:00:22+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/freebirds3d.com\\\/?page_id=29\",\"url\":\"https:\\\/\\\/freebirds3d.com\\\/?page_id=29\",\"name\":\"pose - freebirds3d\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/freebirds3d.com\\\/#website\"},\"datePublished\":\"2026-06-26T00:58:19+00:00\",\"dateModified\":\"2026-06-26T01:00:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/freebirds3d.com\\\/?page_id=29#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/freebirds3d.com\\\/?page_id=29\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/freebirds3d.com\\\/?page_id=29#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/freebirds3d.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"pose\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/freebirds3d.com\\\/#website\",\"url\":\"https:\\\/\\\/freebirds3d.com\\\/\",\"name\":\"freebirds3d\",\"description\":\"3D models\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/freebirds3d.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"pose - freebirds3d","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/freebirds3d.com\/?page_id=29","og_locale":"en_US","og_type":"article","og_title":"pose - freebirds3d","og_description":"Bucket Baby GLB Poser &#8211; v3 Media Library Bucket Baby GLB Poser v3 Load Model Load from your computer Load [&hellip;]","og_url":"https:\/\/freebirds3d.com\/?page_id=29","og_site_name":"freebirds3d","article_modified_time":"2026-06-26T01:00:22+00:00","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/freebirds3d.com\/?page_id=29","url":"https:\/\/freebirds3d.com\/?page_id=29","name":"pose - freebirds3d","isPartOf":{"@id":"https:\/\/freebirds3d.com\/#website"},"datePublished":"2026-06-26T00:58:19+00:00","dateModified":"2026-06-26T01:00:22+00:00","breadcrumb":{"@id":"https:\/\/freebirds3d.com\/?page_id=29#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/freebirds3d.com\/?page_id=29"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/freebirds3d.com\/?page_id=29#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/freebirds3d.com\/"},{"@type":"ListItem","position":2,"name":"pose"}]},{"@type":"WebSite","@id":"https:\/\/freebirds3d.com\/#website","url":"https:\/\/freebirds3d.com\/","name":"freebirds3d","description":"3D models","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/freebirds3d.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/freebirds3d.com\/index.php?rest_route=\/wp\/v2\/pages\/29","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/freebirds3d.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/freebirds3d.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/freebirds3d.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/freebirds3d.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=29"}],"version-history":[{"count":5,"href":"https:\/\/freebirds3d.com\/index.php?rest_route=\/wp\/v2\/pages\/29\/revisions"}],"predecessor-version":[{"id":34,"href":"https:\/\/freebirds3d.com\/index.php?rest_route=\/wp\/v2\/pages\/29\/revisions\/34"}],"wp:attachment":[{"href":"https:\/\/freebirds3d.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=29"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}