blanchon's picture
Update
838a719
<!-- From https://github.com/brean/urdf-viewer -->
<script lang="ts">
// The link element describes a rigid body with an inertia, visual features, and collision properties.
import type IUrdfLink from "../interfaces/IUrdfLink";
import UrdfVisual from "./UrdfVisual.svelte";
import { getChildJoints } from "../utils/UrdfParser";
import UrdfJoint from "./UrdfJoint.svelte";
import type IUrdfRobot from "../interfaces/IUrdfRobot";
import { T } from "@threlte/core";
import Pointcloud from "@/components/3d/misc/Pointcloud.svelte";
interface Props {
robot: IUrdfRobot;
link: IUrdfLink;
textScale?: number;
showName?: boolean;
showVisual?: boolean;
showCollision?: boolean;
visualColor?: string;
visualOpacity?: number;
collisionOpacity?: number;
collisionColor?: string;
jointNames?: boolean;
joints?: boolean;
jointColor?: string;
jointIndicatorColor?: string;
nameHeight?: number;
showLine?: boolean;
opacity?: number;
isInteractive?: boolean;
}
let {
robot,
link,
textScale = 1,
showName = true,
showVisual = true,
showCollision = true,
visualColor = "#000000",
visualOpacity = 1,
collisionOpacity = 1,
collisionColor = "#000000",
jointNames = true,
joints = true,
jointColor = "#000000",
jointIndicatorColor = "#000000",
nameHeight = 0.1,
showLine = true,
opacity = 0.7,
isInteractive = false
}: Props = $props();
let showPointCloud = false;
</script>
{@html `<!-- Link ${link.name} -->`}
<!-- {#if showName}
<Billboard position.x={0} position.y={0} position.z={0}>
<Text anchorY={-0.2} scale={textScale} text={link.name} characters="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
></Text>
</Billboard>
{/if} -->
{#if showVisual}
{#each link.visual as visual}
<UrdfVisual opacity={visualOpacity} {visual} defaultColor={visualColor} />
{/each}
{/if}
{#if showCollision}
{#each link.collision as visual}
<UrdfVisual opacity={collisionOpacity} {visual} defaultColor={collisionColor} />
{/each}
{/if}
{#each getChildJoints(robot, link) as joint (joint.name)}
<UrdfJoint
{robot}
{joint}
{showName}
{nameHeight}
{jointColor}
{jointIndicatorColor}
{showLine}
{opacity}
{isInteractive}
{showVisual}
{showCollision}
{visualOpacity}
{collisionOpacity}
{collisionColor}
{jointNames}
{joints}
/>
{#if joint.type === "fixed" && showPointCloud}
<T.Group
position={[joint.origin_xyz[0], joint.origin_xyz[1], joint.origin_xyz[2]]}
rotation={joint.origin_rpy}
>
<T.Group scale={[0.1, 0.1, 0.1]}>
<T.Mesh scale={[0.1, 0.1, 0.1]}>
<T.BoxGeometry />
<T.MeshBasicMaterial color="red" />
</T.Mesh>
<Pointcloud
cameraPositionX={joint.origin_xyz[0]}
cameraPositionY={joint.origin_xyz[1]}
cameraPositionZ={joint.origin_xyz[2]}
cameraRotationX={joint.origin_rpy[0]}
cameraRotationY={joint.origin_rpy[1]}
cameraRotationZ={joint.origin_rpy[2]}
/>
</T.Group>
</T.Group>
{/if}
{/each}