@@ -48,6 +48,48 @@ function cylinderBetweenPoints(P1, P2, R1, R2, color){
4848 return [ cyl , s1 , s2 ] ;
4949}
5050
51+ function rectangleBetweenPoints ( P1 , P2 , SideA , SideB , color , SideA_dir ) {
52+
53+ var arr = segmentOrient ( P1 , P2 ) ;
54+
55+ // arr[2] = half length. Full length = 2*arr[2]
56+ var length = 2 * arr [ 2 ] ;
57+
58+ // BoxGeometry: (X = SideA, Y = beam longitudinal axis, Z = SideB)
59+ var box_geo = new THREE . BoxGeometry ( SideA , length , SideB ) ;
60+
61+ // Extract rotation:
62+ var rotOnly = new THREE . Matrix4 ( ) . extractRotation ( arr [ 0 ] ) ;
63+ // Beam longitudinal axis in global coordinates
64+ var beamAxis = new THREE . Vector3 ( 0 , 1 , 0 ) . applyMatrix4 ( rotOnly ) . normalize ( ) ;
65+ // SideA direction in global coordinate system
66+ var SideA_global = new THREE . Vector3 ( 1 , 0 , 0 ) . applyMatrix4 ( rotOnly ) . normalize ( ) ;
67+ // Target direction (already global and perpendicular to beam)
68+ var target = new THREE . Vector3 (
69+ - SideA_dir [ 1 ] , // x = -y OpenFAST
70+ SideA_dir [ 2 ] , // y = z OpenFAST
71+ - SideA_dir [ 0 ] // z = -x OpenFAST
72+ ) . normalize ( ) ;
73+ // Compute spin angle around beam axis
74+ var cross = new THREE . Vector3 ( ) . crossVectors ( SideA_global , target ) ;
75+ var dot = THREE . MathUtils . clamp ( SideA_global . dot ( target ) , - 1 , 1 ) ;
76+ var spin_angle = Math . atan2 ( cross . dot ( beamAxis ) , dot ) ;
77+ // Apply spin angle:
78+ box_geo . rotateY ( spin_angle ) ;
79+
80+ var box_mat = new THREE . MeshPhongMaterial ( {
81+ color : color ,
82+ shininess : 60
83+ } ) ;
84+
85+ var box = new THREE . Mesh ( box_geo , box_mat ) ;
86+
87+ box . applyMatrix4 ( arr [ 0 ] ) ;
88+ box . position . copy ( arr [ 1 ] ) ;
89+ box . updateMatrixWorld ( ) ;
90+
91+ return box ;
92+ }
5193
5294/** Create a Plane for Sea Level **/
5395function createSeaLevelObject ( width ) {
@@ -148,4 +190,4 @@ function getExtent(scene){
148190 return e ;
149191}
150192
151- export { segmentOrient , cylinderBetweenPoints , createSeaLevelObject , createSeaBedObject , getExtent } ;
193+ export { segmentOrient , cylinderBetweenPoints , rectangleBetweenPoints , createSeaLevelObject , createSeaBedObject , getExtent } ;
0 commit comments