source: js/standard_expdef_demo/js/external/framsjs/visualization/partmeshfactory.js @ 880

Last change on this file since 880 was 880, checked in by Maciej Komosinski, 5 years ago

A simple javascript demo/animation of the basic behavior of "standard.expdef" experiment definition in Framsticks

File size: 5.6 KB
Line 
1class PartMeshFactory {
2    /**
3     * Basic constructor that takes information of how parts should be drawn.
4     * @param {object} config object holding following fields
5     * @param {object} config.defaultShape object holding following fields
6     * @param {number} config.defaultShape.radius radius of part cylinder
7     * @param {number} config.defaultShape.segments number of segments on cylinder
8     * @param {object} config.ellipsoidShape object holding following fields
9     * @param {number} config.ellipsoidShape.radius radius of part ellipsoid
10     * @param {number} config.ellipsoidShape.segments number of segments on ellipsoid
11     *
12     */
13    constructor(config) {
14        this.config = config;
15        this.transformations = new ShapeTransformations();
16        this.partShapes = this.transformations.getPartShapes();
17    }
18
19    /**
20     * Creates sphere mesh for a given part.
21     * @param {Module.Part} part part, for which Mesh is generated
22     * @param {number} sphereRadius radius of part sphere
23     * @param {number} segments number of created segments
24     * @param {boolean} applyScale true if scale for this mesh should be applied from Module.Part
25     * @returns {PartMesh} info about part mesh
26     */
27    getNewSphereMesh(part, sphereRadius, segments, applyScale) {
28        let geometry = new THREE.SphereGeometry(sphereRadius, segments, segments);
29        let material = this.transformations.getNewMaterial(
30            part.get_vcolor().get_x(),
31            part.get_vcolor().get_y(),
32            part.get_vcolor().get_z());
33        let mesh = new THREE.Mesh(geometry, material);
34        mesh.position.set(
35            part.get_p().get_x(),
36            part.get_p().get_y(),
37            part.get_p().get_z());
38
39        if (applyScale) {
40            mesh.scale.set(
41                part.get_scale().get_x(),
42                part.get_scale().get_y(),
43                part.get_scale().get_z());
44        }
45
46        let angles = part.get_o().getAngles();
47        mesh.rotation.copy(
48            this.transformations.getPartRotation(
49                angles.get_x(),
50                angles.get_y(),
51                angles.get_z())
52        );
53
54        mesh.userData = {
55            isBodyElement: true,
56            type: 'p',
57            data: part,
58            mesh: mesh,
59            connectedJoints: []
60        };
61        return mesh;
62    }
63
64    /**
65     * Creates box mesh for a given part
66     * @param {Module.Part} part part, for which Mesh is generated
67     * @returns {PartMesh} info about part mesh
68     */
69    getNewBoxMesh(part) {
70        let geometry = new THREE.BoxGeometry(2, 2, 2);
71        let material = this.transformations.getNewMaterial(
72            part.get_vcolor().get_x(),
73            part.get_vcolor().get_y(),
74            part.get_vcolor().get_z());
75        let mesh = new THREE.Mesh(geometry, material);
76        mesh.position.set(
77            part.get_p().get_x(),
78            part.get_p().get_y(),
79            part.get_p().get_z());
80
81        mesh.scale.set(
82            part.get_scale().get_x(),
83            part.get_scale().get_y(),
84            part.get_scale().get_z());
85
86        let angles = part.get_o().getAngles();
87        mesh.rotation.copy(this.transformations.getPartRotation(
88            angles.get_x(),
89            angles.get_y(),
90            angles.get_z()));
91
92        mesh.userData = {
93            isBodyElement: true,
94            type: 'p',
95            data: part,
96            mesh: mesh,
97            connectedJoints: []
98        };
99        return mesh;
100    }
101
102    /**
103     * Creates cylinder mesh for a given part
104     * @param {Module.Part} part part, for which Mesh is generated
105     * @returns {PartMesh} info about part mesh
106     */
107    getNewCylinderMesh(part) {
108        let geometry = new THREE.CylinderGeometry(1, 1, 2, 32);
109        let material = this.transformations.getNewMaterial(
110            part.get_vcolor().get_x(),
111            part.get_vcolor().get_y(),
112            part.get_vcolor().get_z());
113        let mesh = new THREE.Mesh(geometry, material);
114        mesh.position.set(
115            part.get_p().get_x(),
116            part.get_p().get_y(),
117            part.get_p().get_z());
118
119        mesh.scale.set(
120            part.get_scale().get_y(),
121            part.get_scale().get_x(),
122            part.get_scale().get_z());
123
124        let angles = part.get_o().getAngles();
125        let m = this.transformations.getCylinderPartRotationMatrix(
126            angles.get_x(),
127            angles.get_y(),
128            angles.get_z());
129
130        mesh.rotation.setFromRotationMatrix(m);
131
132        mesh.userData = {
133            isBodyElement: true,
134            type: 'p',
135            data: part,
136            mesh: mesh,
137            connectedJoints: []
138        };
139        return mesh;
140    }
141
142    /**
143     * Creates part mesh according to which shape should be applied for a given
144     * part.
145     * @param {Module.Part} part part, for which Mesh is generated
146     * @returns {PartMesh} info about part mesh
147     */
148    create(part) {
149
150        let shape = part.get_shape();
151        if (this.partShapes['SHAPE_ELLIPSOID'].value == shape) {
152            return this.getNewSphereMesh(
153                part,
154                this.config.ellipsoidShape.radius,
155                this.config.ellipsoidShape.segments, true);
156        }
157        else if (this.partShapes['SHAPE_CUBOID'].value == shape) {
158            return this.getNewBoxMesh(part);
159        }
160        else if (this.partShapes['SHAPE_CYLINDER'].value == shape) {
161            return this.getNewCylinderMesh(part);
162        }
163
164        return this.getNewSphereMesh(
165            part,
166            this.config.defaultShape.radius,
167            this.config.defaultShape.segments,
168            false);
169    }
170}
Note: See TracBrowser for help on using the repository browser.