raytracerNOGLFWtest.py

You can view and download this file on Github: raytracerNOGLFWtest.py

  1# -*- coding: utf-8 -*-
  2#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3# This is an EXUDYN example
  4#
  5# Details:  Create scissor-like chain of bodies and prismatic joints to test functionality
  6#
  7# Author:   Johannes Gerstmayr
  8# Date:     2020-01-14
  9#
 10# Copyright:This file is part of Exudyn. Exudyn is free software. You can redistribute it and/or modify it under the terms of the Exudyn license. See 'LICENSE.txt' for more details.
 11#
 12#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 13
 14import exudyn as exu
 15#a local run must not open a plot window when windows are suppressed (#2477)
 16if exu.special.userInterface.suppressPlots: import matplotlib; matplotlib.use('Agg')
 17from exudyn.utilities import * #includes itemInterface and rigidBodyUtilities
 18from math import sin, cos
 19import exudyn.graphics as graphics
 20
 21testIsActive = exu.sys.get('testIsActive', False)
 22testIsActive = True
 23import numpy as np
 24
 25SC = exu.SystemContainer()
 26mbs = SC.AddSystem()
 27
 28gBack = graphics.CheckerBoard(point=[0,0,0], size=10, nTiles=10, normal=[0.,0.,1],
 29                              color=[0.9,0.9,0.9]+[graphics.material.indexChrome], 
 30                              alternatingColor=[0.8,0.8,0.8]+[graphics.material.indexChrome],
 31                              addEdges=False)
 32
 33text = '''
 34 !"#$%&'()*+,-./
 350123456789:;<=>?
 36@ABCDEFGHIJKLMNO
 37PQRSTUVWXYZ[\\]^_
 38`abcdefghijklmno
 39pqrstuvwxyz{|}~
 40ΓΔΘΛΞΠΣΦΨΩαβγδεζ
 41ηθικλμνξοπρστυφχ
 42ψωϕϵ₀₁₂₃₄₅₆₇₈₉⁰¹
 43²³⁴⁵⁶⁷⁸⁹∂∫♥√≈∞🙂😒
 44ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ
 45ÐÑÒÓÔÕÖרÙÚÛÜÝÞß
 46àáâãäåæçèéêëìíîï
 47ðñòóôõö÷øùúûüýþÿ'''
 48
 49gText = graphics.Text(point=[0,-5,1], text=text, color=[0.2,0.2,0.2,1], fontSize=12)
 50
 51mbs.CreateGround(referencePosition=[0,0,-1], graphicsDataList=[gBack]+[gText]*(1-(not testIsActive)) )
 52
 53gObjectsList = []
 54
 55nMaterials = 10
 56nTiles = 16*2
 57
 58for i in range(nMaterials//2):
 59    i0 = i*2
 60    i1 = i*2+1
 61    color0 = graphics.colorList[i0]
 62    color1 = graphics.colorList[i1]
 63    gBrick = graphics.Brick(size=[0.8,1.25,0.7], 
 64                                  color=color0[:3]+[graphics.material.indexDefault+i0],
 65                                  addEdges=True,addNormals=True,
 66                                  )
 67
 68    gSphere = graphics.Sphere(radius=0.8,
 69                              color=color1[:3]+[graphics.material.indexDefault+i1],
 70                              nTiles=nTiles)
 71
 72    gSphere = graphics.Move(gSphere, [0,0,0], np.diag([1.2,0.8,0.8]) )
 73    
 74    gObjectsList.append( mbs.CreateGround(referencePosition=[0,0,0],
 75                                          graphicsDataList=[gBrick]) )
 76    gObjectsList.append( mbs.CreateGround(referencePosition=[0,0,0],
 77                                          graphicsDataList=[gSphere]) )
 78
 79#just to simulate something
 80mbs.CreateRigidBody(referencePosition=[3,0.8,1], 
 81                    inertia=InertiaCuboid(1000, [2,1.2,1]),
 82                    show=False)
 83
 84mbs.Assemble()
 85
 86import matplotlib.pyplot as plt
 87
 88mbs.variables['imageCounter'] = 0
 89#rotation matrix for view CTRL-7:
 90A=RotationVector2RotationMatrix(52/180*pi*np.array([-0.82,0.25,0.5149]))
 91
 92def PreStepUserFunction(mbs, t):
 93    if t > 0:
 94        rot = RotationMatrix2RotationVector(A@RotationMatrixZ(0.5*t*0.5*pi))
 95        SC.renderer.SetModelView(5.7,rot,[0,0,0])
 96        if not testIsActive:
 97            image = SC.renderer.RedrawAndGetImage(True)
 98            imageCounter = mbs.variables['imageCounter']
 99            exu.Print(f'image: frame{imageCounter:05}.png:',image.shape)
100            plt.imsave(f"images/frame{imageCounter:05}.png", image)
101            mbs.variables['imageCounter'] += 1
102
103    fact = t if t < 1 else 1
104    #fact = 1
105    for i, obj in enumerate(gObjectsList):
106        offset = 0.2*t*0.5*pi
107        radius = 4*fact
108        phi = offset + i/nMaterials * 2 * pi
109        pos = [radius*sin(phi),radius*cos(phi),1.25]
110        mbs.SetObjectParameter(obj, 'referencePosition', pos)
111        rot = RotXYZ2RotationMatrix([5*phi, 2*phi,0])
112        mbs.SetObjectParameter(obj, 'referenceRotation', rot)
113    return True
114
115mbs.SetPreStepUserFunction(PreStepUserFunction)
116
117#sizeFactor=1, nTiles=128, lightVariations=71, multisampling=1:
118#OLD: approx 0.7s / image
119windowSize = [1200,1000]
120if testIsActive:
121    windowSize = [400,300] #3
122
123SC.visualizationSettings.view0.window.renderWindowSize = windowSize
124
125SC.visualizationSettings.general.useMultiThreadedRendering = False
126#SC.visualizationSettings.view0.window.showComputationInfo = False
127SC.visualizationSettings.nodes.showNumbers = True
128SC.visualizationSettings.nodes.show = True
129# SC.visualizationSettings.general.textAlwaysInFront = False
130
131
132SC.visualizationSettings.openGL.multiSampling = 2
133SC.visualizationSettings.openGL.light1.enable = False
134SC.visualizationSettings.openGL.light0.position = [0,0,15,1]
135SC.visualizationSettings.openGL.light1.position = [-3,-3,-10,1]
136SC.visualizationSettings.openGL.light1.diffuse = SC.visualizationSettings.openGL.light0.diffuse
137#SC.visualizationSettings.openGL.light1.specular = SC.visualizationSettings.openGL.light0.specular
138SC.visualizationSettings.openGL.light0.shadow = 0.2
139SC.visualizationSettings.raytracer.numberOfThreads = 8+32*(not testIsActive)
140SC.visualizationSettings.openGL.light0.lightRadius = 0.5
141SC.visualizationSettings.raytracer.lightRadiusVariations = 13
142SC.visualizationSettings.raytracer.advanced.shadowSmoothingSteps = 2
143SC.visualizationSettings.raytracer.advanced.shadowScalingFactor = 3
144SC.visualizationSettings.raytracer.verbose = (not testIsActive)+1
145SC.visualizationSettings.raytracer.maxReflectionDepth = 2
146SC.visualizationSettings.raytracer.maxTransparencyDepth = 2
147#SC.visualizationSettings.view0.camera.useRaytracer = True
148SC.visualizationSettings.raytracer.imageSizeFactor = 1
149SC.visualizationSettings.raytracer.keepWindowActive = True
150SC.visualizationSettings.view0.camera.clippingPlaneNormal = [0,1*0,0]
151SC.visualizationSettings.view0.camera.clippingPlaneDistance = 2.
152SC.visualizationSettings.view0.camera.perspective = 1
153
154SC.visualizationSettings.view0.scene.drawCoordinateSystem = 2
155SC.visualizationSettings.general.useGradientBackground = True
156
157
158m = SC.renderer.materials.Get("chrome")
159m.reflectivity = 0.12
160SC.renderer.materials.Set("chrome", m)
161
162if False:
163    import matplotlib.pyplot as plt
164    exu.Print('get image...')
165    SC.renderer.SetState({'displayScaling':1.5})
166    SC.renderer.SetModelView(9,[0,0,1],[1,0,0])
167    image = SC.renderer.RedrawAndGetImage(True)
168    exu.Print('image:',image.shape)
169    plt.imshow(image)
170    plt.show(block=True)
171
172
173tEnd = 4
174stepSize = 2e-2
175simulationSettings = exu.SimulationSettings()
176simulationSettings.solution.file.write = False
177#simulationSettings.timeIntegration.realtime.active = True
178#simulationSettings.timeIntegration.realtime.factor = 0.2
179simulationSettings.timeIntegration.numberOfSteps = int(tEnd/stepSize)
180simulationSettings.timeIntegration.endTime = tEnd
181
182if not testIsActive:
183    SC.renderer.Start()              #start graphics visualization
184    SC.renderer.SetModelView(5.7,52/180*pi*np.array([-0.82,0.25,0.5149]),[0,0,0])
185
186mbs.SolveDynamic(simulationSettings)
187
188if not testIsActive:
189    SC.renderer.DoIdleTasks()
190    SC.renderer.Stop()
191
192if testIsActive:
193    #this example shows how to retrieve a single image:
194    import matplotlib.pyplot as plt
195
196    exu.Print('get image...')
197    #rotation matrix for view CTRL-7:
198    SC.renderer.SetState({'displayScaling':1.5})
199    SC.renderer.SetModelView(5.7,52/180*pi*np.array([-0.82,0.25,0.5149]),[0,0,0])
200    image = SC.renderer.RedrawAndGetImage(True)[0:int(windowSize[1]*0.9),:,:] #cut out version info!
201    if False: #save image for manual check
202        exu.Print('image:',image.shape, ', save as images/test.jpg')
203        plt.imsave("images/test.jpg", image)
204        plt.imshow(image)
205        plt.show(block=False)
206
207    #compute checksum for image:
208    flat_pixels = image.ravel().astype(np.int64) 
209    n = flat_pixels.size
210    counters = np.arange(n, 2*n, dtype=np.int64) #start at n, so pixels are weighted different, but similar
211    checksum = np.sum(flat_pixels * counters)/np.int64(1e14)
212    exu.Print('raytracerNOGLFWtest: image checksum=', checksum)
213
214    exu.sys['testResult'] = checksum